[英]Floating point numbers inaccuracy?
我提示用戶輸入一個浮點數。 我將數字保存在float變量中,然后乘以100以使其為整數。 只允許小數點后2位,所以這很容易。 現在奇怪的部分是:
我只嘗試了這件事直到10.00。
請問為什么浮點數不正確? 我知道了此行為的原因,但是沒有任何辦法知道哪個數字的行為會奇怪嗎?
我不知道一種預測哪個數字將執行此操作的方法,但是大多數程序員並不在乎。
您沒有指定使用的語言,但是如果要將某些內容從浮點表示形式更改為整數表示形式,通常必須使用Double.intValue()
或Double.longValue()
Double.intValue()
類的函數進行顯式轉換。 Double.longValue()
或Java轉換運算符(int)double_value;
這些技術通常只是剔除數字的小數部分。 您可能要使用舍入函數。 再次,在Java中,如[javadoc]( http://docs.oracle.com/javase/7/docs/api/java/lang/Math.html )中所述,它將為Math.round()
)。
我只能告訴您不會發生哪些數字:
所有可以精確地用二進制表示的數字,即形式為所有數字:
N = Sum(i, 2^n(i))
要么:
N = 2^n1 + 2^n2 + 2^n3 + ....
其中n(i)
是有限范圍內的整數(正數或負數)。
使用FLT_DIG
以匹配的十進制符號形式打印數字。
FLT_DIG
到float
將顯示的前導十進制數字的數目,並與其十進制分配的值匹配。 至少為 6。在下面的示例中,可以將2.1
打印到2.10000e+00
,這是6個有效數字。 可以將990.0
打印到9.90000e+02
,這也是6位有效數字。
printf("%.*e", FLT_DIG - 1, 2.1f); // 2.10000e+00
printf("%.*e", FLT_DIG - 1, 990.f); // 9.90000e+02
當代碼執行諸如乘以100
操作時, float
乘積可能會產生舍入誤差。 C在這里沒有指定精度,但是可以預期<0.5百萬分之一的誤差。 通過許多操作,這會減少從FLT_DIG
到可靠數字的數量。
通常,避免期望匹配算法和計算機結果比FLT_DIG
數字更好。 如果那還不夠,請使用double
,它至少對至少10位數字有效(對於典型的double
,對15位數字有利-使用DBL_DIG
)
注意: "%.5e"
指示printf()
在小數點前打印1位,在小數點后打印5位,總共6位有效數字。 這就是在printf("%.*e", FLT_DIG - 1, ...);
為-1
的原因printf("%.*e", FLT_DIG - 1, ...);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.