2011-05-26 30 views
4

對於整數和浮點數,JavaScript沒有不同的類型。當處理「整數」時,這是否意味着我需要擔心舍入誤差?我何時需要擔心JavaScript中的浮點錯誤?

例如,如果我想知道當一些x是被3整除,是好寫

x % 3 == 0 

或做我需要做的浮點式的比較如:

x % 3 <= 0.5 

任何洞察力將不勝感激。

(如果我需要做的不平等存在,有關檢查如果傳遞函數參數等於1是什麼,我可以寫x === 1或不呢?)

+1

模數算術不只是在整數上工作 - 4.5%.5返回0,如同.6%.3。 – kennebec 2011-05-27 04:24:39

回答

1

如果x是一個整數,你可以先寫模數。

只有當你想失敗,比如說一個字符串「1」或布爾值爲true,但是傳遞一個整數1時,才需要'===';否則'=='應該就足夠了。

+0

在大多數編程語言中,「1」== 1返回false; JavaScript也是這樣做的。 – 2011-05-27 01:09:40

4

如果您使用整數,它通常是安全的。但是,一些浮點運算可能會非常奇怪。如果您在使用模之前數執行浮點運算,即使合乎邏輯的結果永遠是一個整數,你應該使用:

Math.floor(x) % 3 === 0 

但是,如果它總是一個整數,像這樣:

var x = 52; 
if(x % 3 === 0) { // safe 
} 

那很好。關於你的第二個問題,===身份運算符在數字之間使用也是安全的。例如:

function x(y) { 
    return y === 7; 
} 

alert(x(7.0)); // true 

工作正常。

+0

謝謝。你有這樣的來源嗎? – 2011-05-27 01:09:12

+0

@Ben Alpert:事實。試試這個:'1.265 * 100000';它給出'126499.99999999999',你必須向上或向下取整才能得到正確的結果。 – Ryan 2011-05-27 01:52:09

+0

對不起,我的意思是int類型的「通常安全」的來源。 – 2011-05-27 02:24:43

0

JavaScript不會爲整型和浮點型展示不同類型,但確實有它們的概念。內置函數parseInt可用於強制一個數字(或任何其他類似數字的值,包括字符串「32.06」!)爲整數。它截斷而不是舍入浮點值。

+0

你有一個源代表它有它們的概念嗎? – 2011-05-27 01:10:01

+0

parseInt和parseFloat函數的存在,主要是=) – 2011-05-27 17:07:01

+0

是的,但'parseInt'只是給你一個恰好等於一個整數的浮點數。它們不是獨立的數據類型。 – dan04 2011-05-29 09:14:57

相關問題