2016-07-07 41 views
-3

我在一個循環中加入了一些float s。 我預計當i達到9時,總和將等於1,並且NSLog(@"EXTRA: %f", sum);將被執行。它從未被執行......這裏發生了什麼?十個0.1浮點數的總和不等於1

這裏是我的代碼:

float number = 0.1; 
float sum = 0; 

for (int i = 0; i < 1000; i++) { 
    sum += number; 

    if (sum == 1) { 
     NSLog(@"EXTRA: %f", sum); 
    } 
    NSLog(@"%f", sum); 
} 
+0

嘗試0.1 + 0.2,如果你知道二進制,寫出二進制0.1。 – Tim

+0

年沒有做過任何二進制 – MegaManX

回答

3

1/10二進制值是一樣的1/3的Denary價值 - 它reccurs。實際上,存儲在變量中的1/10的值是0.0001100110011001100110011...

但是這個數字的長度受限於float長度或32/64位操作系統。

所以,當我添加0.0001100110.000110011我得到0.001100110這是不太2/10,同爲0.333333 + 0.333333 =!它等於0.66666

這發生了9次,所以1/10 * 10二進制不等於1,它是0.111111111,它等於0.998046875 - 關閉1很長的路要走。

更多小數位數(例如30)0.000110011001100110011001100110 * 1010 = 0.1111111111111111111111111111000.999999996274709701538085937500。這不完全是1