簡體   English   中英

浮點數不准確?

[英]Floating point numbers inaccuracy?

我提示用戶輸入一個浮點數。 我將數字保存在float變量中,然后乘以100以使其為整數。 只允許小數點后2位,所以這很容易。 現在奇怪的部分是:

  1. 用戶輸入:0.1->輸出:100
  2. 用戶輸入:1.1->輸出:110
  3. 用戶輸入:1.5->輸出:150
  4. 用戶輸入:2.1->輸出:209.999985
  5. 用戶輸入:2.5->輸出:250
  6. 用戶輸入:3.8->輸出:380
  7. 用戶輸入:4.2->輸出:419.999969
  8. 用戶輸入:5.6->輸出:560
  9. 用戶輸入:6.0->輸出:600
  10. 用戶輸入:7.5->輸出:750
  11. 用戶輸入:8.1->輸出:810.000061
  12. 用戶輸入:9.9->輸出:989.999969

我只嘗試了這件事直到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_DIGfloat將顯示的前導十進制數字的數目,並與其十進制分配的值匹配。 至少為 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM