對於整數和浮點數,JavaScript沒有不同的類型。當處理「整數」時,這是否意味着我需要擔心舍入誤差?我何時需要擔心JavaScript中的浮點錯誤?
例如,如果我想知道當一些x
是被3整除,是好寫
x % 3 == 0
或做我需要做的浮點式的比較如:
x % 3 <= 0.5
任何洞察力將不勝感激。
(如果我需要做的不平等存在,有關檢查如果傳遞函數參數等於1是什麼,我可以寫x === 1
或不呢?)
對於整數和浮點數,JavaScript沒有不同的類型。當處理「整數」時,這是否意味着我需要擔心舍入誤差?我何時需要擔心JavaScript中的浮點錯誤?
例如,如果我想知道當一些x
是被3整除,是好寫
x % 3 == 0
或做我需要做的浮點式的比較如:
x % 3 <= 0.5
任何洞察力將不勝感激。
(如果我需要做的不平等存在,有關檢查如果傳遞函數參數等於1是什麼,我可以寫x === 1
或不呢?)
如果x是一個整數,你可以先寫模數。
只有當你想失敗,比如說一個字符串「1」或布爾值爲true,但是傳遞一個整數1時,才需要'===';否則'=='應該就足夠了。
在大多數編程語言中,「1」== 1返回false; JavaScript也是這樣做的。 – 2011-05-27 01:09:40
如果您使用整數,它通常是安全的。但是,一些浮點運算可能會非常奇怪。如果您在使用模之前數執行浮點運算,即使合乎邏輯的結果永遠是一個整數,你應該使用:
Math.floor(x) % 3 === 0
但是,如果它總是一個整數,像這樣:
var x = 52;
if(x % 3 === 0) { // safe
}
那很好。關於你的第二個問題,===
身份運算符在數字之間使用也是安全的。例如:
function x(y) {
return y === 7;
}
alert(x(7.0)); // true
工作正常。
謝謝。你有這樣的來源嗎? – 2011-05-27 01:09:12
@Ben Alpert:事實。試試這個:'1.265 * 100000';它給出'126499.99999999999',你必須向上或向下取整才能得到正確的結果。 – Ryan 2011-05-27 01:52:09
對不起,我的意思是int類型的「通常安全」的來源。 – 2011-05-27 02:24:43
JavaScript不會爲整型和浮點型展示不同類型,但確實有它們的概念。內置函數parseInt
可用於強制一個數字(或任何其他類似數字的值,包括字符串「32.06」!)爲整數。它截斷而不是舍入浮點值。
你有一個源代表它有它們的概念嗎? – 2011-05-27 01:10:01
parseInt和parseFloat函數的存在,主要是=) – 2011-05-27 17:07:01
是的,但'parseInt'只是給你一個恰好等於一個整數的浮點數。它們不是獨立的數據類型。 – dan04 2011-05-29 09:14:57
模數算術不只是在整數上工作 - 4.5%.5返回0,如同.6%.3。 – kennebec 2011-05-27 04:24:39