0

我有一個小問題,我找不到解決方案!目標-C中的花車故障

我的代碼是(這只是一個示例代碼,但我原來的代碼做這樣的事情):

float x = [@"2.45" floatValue]; 


for(int i=0; i<100; i++) 
    x += 0.22; 

NSLog(@"%f", x); 

輸出爲52.450001而不是52.450000!

我不知道,因爲這樣的事情發生!

感謝您的幫助!

〜解決〜

感謝大家!是的,我已經解決了雙重類型!

+1

hanno的鏈接解釋了這個問題。這個特殊的例子不會發生在double而不是float上,但是存在相同的基本缺陷。 – JimG 2009-07-28 11:54:36

回答

6

浮標是具有一定精度的數字表示。不是每個值都可以用這種格式表示。另請參閱here

你可以很容易地想到爲什麼會出現這種情況:只有在intervall(1..1)中有無限數量的數字,但是一個浮點只有有限的位數來表示所有數字( -MAXFLOAT..MAXFLOAT)。

更合適地說:在一個32位整數表示中有一個可數數量的整數將被表示,但是有無數的無限數量的實數值不能在32或64位的有限表示中完全表示。因此,不僅對最高和最低可表示的實際值有限制,而且對準確性也有限制。

那麼爲什麼一個數字在浮點數受影響後有小數字?因爲表示是基於二進制而不是十進制,所以其他數字很容易表示,然後是小數。

2

浮點數不能總是由計算機輕鬆表示。這會導致某些數字不準確。

這就像我問你小數點是多少1/3。不管你怎麼努力,你都無法告訴我它是什麼,因爲小數不能準確地描述這個數字。

浮點數不能準確地描述一些十進制數。