2011-03-01 50 views
13

我很震驚地看到JS中有這樣一個基本的減法錯誤,我相信你們大多數人會遇到這個問題,請幫我在這裏工作, 我所做的只是減去一個從100的數字,這給出了意想不到的結果,一個例子如下所述Javascript中的簡單減法錯誤

100 - 99.1 
// returns 0.9000000000000057 

我在這裏做錯了什麼? :S我很困惑

+8

您需要了解浮點數的存儲方式是:http:/ /floating-point-gui.de/ – codaddict 2011-03-01 10:14:58

+4

這不是一個錯誤。我很驚訝地看到程序員的這個問題。 – 2011-03-01 10:23:21

+0

可能重複的[是JavaScript的數學破?](http://stackoverflow.com/questions/588004/is-javascripts-math-broken) – 2011-03-01 10:33:05

回答

12

浮點值是像您期望的永遠準確。您可以使用Number對象將其轉換爲您需要的答案。

Number(100).toFixed(2) - Number(99.1).toFixed(2) 
+1

'數字(100-99.1).toFixed(2)'更加清晰,並且你不會增加錯誤,因爲100在base-2中已經完美表示。 – 2011-03-01 10:24:15

+0

到我的固定作品,現在就開始研究浮點數:)謝謝大家 – 2011-03-01 10:58:24

+1

「浮點數值從來不會像你期望的那樣準確」 - 而是取決於人的期望,是不是:) – AakashM 2011-03-01 11:12:52

4

在JavaScript中,所有數字類型都是Number對象,它們表示爲雙精度浮點數。

在另一方面,你可以通過使用NumbertoFixed方法,它接受一個數表示多少小數點檢索這些數字的字符串表示一個特定的小數點你想返回的字符串表示基於對接收器。

一個例子:

var five = 5.00001; 
console.log(five.toFixed(1)); //5.0 
7

您正在使用浮點數,而不是整數。這是預料之中的。

原因是你不能準確地表示二進制數字如0.1和0.3。就像你不能用十進制表示三分之一一樣。

1

首先,防止自己將浮點值分配給變量,然後用直接表達式將其轉換爲變量。這裏有一個例子:

**var c = 80.35-20.35; 
alert(c.toFixed(2));** 

這將分配60.00,但其他的方式來解決這將返回59.99999999。

0

這不是一個完美的答案,但它的工作原理。

function format_float_bug(num) 
{ 
    return parseFloat(num.toFixed(15)); 
} 

你可以使用如下,

format_float_bug(4990 % 10); 

因爲低於號(49.89999999999999857891452848)第15位小數就像9999999