trunc(0.7/0.1) = 7 這個正常
但若把0.7 定義成變數
比如 ss:double;
ss:=0.7;
trunc(ss/0.1) = 6 ????
各位求教 如何才能得到正確的7 ?
uj5u.com熱心網友回復:
的確是0.60.7的科學記數法時候的值一般都顯示為0.6xxxxcccxxcxE
uj5u.com熱心網友回復:
理想的辦法是,盡量用整數進行,如你的題目:trunc((ss*10)/(0.1*10))
這樣才接近你想要的真正結果
uj5u.com熱心網友回復:
不奇怪,這是trunc,不是round,就是round在IEEE754標準中也定義了5種舍入演算法。trunc一個數,如果該數的二進制浮點不能精確表示十進制值,就j可能產生比較大的誤差。Delphi中,如果要求精度比較高的浮點運算,1可以用TBcd型別,可以表示最多64位十進制數字(整數+小數),從D6開始就有TBcd運算庫,如果對性能要求比較高不建議使用,可以用第三方的大數運算庫,諸如MPArith、BigFloat之類的。
uj5u.com熱心網友回復:
這是Double的精度造成的:ss:double;
ss:=0.7;
實際上SS的值是0.6999999999999
這樣, trunc(ss/0.1) 就是0.699999999999999/0.1了,自然就是6.9999999....
uj5u.com熱心網友回復:
謝謝各位,就是如各位所言,但該如何表達呢,但是對ss進行自編的四舍五入也不行,分子分母都乘以100也不行。總不能 ss:double;
ss:=0.7;
trunc((ss+0.00000001)/0.1) = 這樣倒是可以,turnc 分子都給加個0.00000001???
uj5u.com熱心網友回復:
uj5u.com熱心網友回復:
前面說了可以用TBcd:
uses Data.FmtBcd;
var
D: double;
//...
D := double(TBcd('0.7') / TBcd('0.1'));
uj5u.com熱心網友回復:
這個可以用一個比較笨的方法
將DOUBLE先轉為字串再轉換
FloatToStr(StrToFloat(FloatToStr(ss))/0.1);//這個就可以得到7
其實,這跟TRUNC函式沒有直接關系,關鍵系統對Double的科學記數導致誤差
uj5u.com熱心網友回復:
trunc是直接舍掉小數了uj5u.com熱心網友回復:
(0.7+0.1/2)/0.1uj5u.com熱心網友回復:
你使用Round替代Trunc是直接截斷
uj5u.com熱心網友回復:
看來1.你對Trunc和Round不了解什么意思啊。
2.你不了解浮點值在記憶體中的表現。
所以你需要知道:
1. trunc,是只取整數位,完全不考慮小數位。所以6.9999999也是6.用Round的話就是7
2. 記憶體里的浮點值是以近似數存在的,使用浮點數進行計算時,要注意邊界值問題。極端時候會出現=號不起作用的,左右兩邊監控值在你除錯時明明一樣,但就是不相等。這種問題很多很多了,原因就是記憶體里的浮點值是以近似數存在的。你必須知道這個原則,才能避免。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/42794.html
標籤:語言基礎/算法/系統設計
