2011-12-22 21 views
1

可能重複:
Is JavaScript's Math broken?
Strange result with floating point additionJavascript數學不精確錯誤? (0.1 + 0.01 + 0.01 + 0.01 + 0.01 + 0.01 == 0.15000000000000002)

在Safari 5.0.6但一些簡單的JavaScript計算的Firefox中的相同現象:

var i=0.1; 
i=i+0.01;  //= 0.11 
i=i+0.01;  //= 0.12 
i=i+0.01;  //= 0.13 
i=i+0.01;  //= 0.14 
i=i+0.01;  // expected == 0.15 
console.log(i); // == 0.15000000000000002 

這種不精確性來自哪裏?

當然,我可以用i.toPrecision()或其他方法處理它,但是它必須是這樣嗎?這是一個浮點舍入錯誤?

同樣的情況,在這個例子中:

var i=0.14+0.01; //expected == 0.15 
console.log(i); //== 0.15000000000000002 

什麼是0.14和0.15之間發生了什麼?

var i=0.1400001+0.01; //expected==0.1500001 
console.log(i);  //== 0.1500001 ok! 

var i=0.14000001+0.01; //expected==0.15000001 !! 
console.log(i);  //== 0.15000001000000002 

什麼我必須做的不同,以得到正確的結果?

+5

歡迎來到用二進制表示浮點數的世界。 – birryree 2011-12-22 05:41:54

+0

http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html所以這是一個問題,通過存儲數據來計算n位數字? – frank 2011-12-22 05:42:58

+1

您可以使用'0.1 + 0.2'更簡潔地重現相似的效果,這會導致'0.30000000000000004'。 – 2011-12-22 05:43:24

回答

0

它們只是浮點錯誤。

使用整數,將您所做的所有事情乘以10 *您想要的精度數。

+0

oh my gosh ..新年快樂,我真的很開心 ''31 | 12 |'+(0.2 + 0.01-2012.21)* - 1' – frank 2011-12-22 06:04:49

8

浮點算術不精確,因爲某些數字無法準確存儲,因此使用近似值。

What Every Computer Scientist Should Know About Floating-Point Arithmetic

你能處理你的Number S作爲整數,然後制定出與師最後的答案?

+0

偉大的鏈接!在假期裏讀點東西(012)... – Jessedc 2011-12-22 05:43:20

+0

@Jessedc - 假設它會比聽你親戚們更感興趣,你一年只看一次:-) – 2011-12-22 05:44:18

+0

@Jessedc:至少你得到他們:D – alex 2011-12-22 05:52:36

0

Floatinhg點數並非精確地存儲在計算機中 - 您需要考慮它們的二進制表示。因此,使用浮點數算術會出現舍入誤差。

相關問題