2011-10-10 110 views
0

我的印象是數值存儲爲浮點。用其他語言比較花車的平等是不可靠的,不推薦。是否有幕後的一些魔法讓這項工作可靠地工作,否則將會是整數?我找不到任何其他參考。在JavaScript中比較數值

回答

2

你對JS中的數字是浮點數是正確的。語言規範的4.3.19段說

012對應於雙精度64位的二進制格式的IEEE 754值

Number值

原始值。

整數的浮點比較工作得很好。 64b IEEE-754可以準確地表示任何大小小於2至53rd的整數(見ULP)。分割時出現問題,或使用必須近似結果的函數Math

如果您確實需要將浮點運算的結果強制爲最接近的整數,請使用Math.round

"What Every Computer Scientist Should Know about Floating Point"對舍入誤差有很好的討論。

-2

如果您知道您要比較的數字是整數,那麼你最好將它們轉換爲整數(例如,如果它們是作爲字符串,然後使用parseInt(value)),然後比較它們作爲整數本身。

+1

JavaScript沒有整數和浮點數的單獨類型。整數是數字。浮點數字也是'數字'。 – icktoofay

+0

我明白,但你可以把它們當作'int' – Saket

0

魔術:parseInt(5) === 5; // true

ECMAScript中有下列數據類型:未定義,空,布爾, 字符串,數字和對象。 (TODO:解釋ECMAScript的類型系統 - 見 也部分X - 類型: http://www.cs.brown.edu/~sk/Publications/Books/ProgLangs/PDF/all.pdfhttp://c2.com/cgi/wiki?CategoryLanguageTyping

ECMAScript的數字是64位二進制浮點數字。 (有關 的詳細信息,請參閱 [ECMA-262])。 SpiderMonkey使用(type-)標記的數據值 值。整數∈[-2 ^(wordsize-1-1),2 ^(wordsize-1-1 [可以將 直接存儲在jsval中(位移和標記)。其他ECMAScript號碼 以間接雙精度浮點 - 點號( jsval存儲標記的指針雙)。整數∈[-2^53,2^53] 可以精確地存儲在雙。1

[1]What Every Computer Scientist Should Know About Floating-Point Arithmetic (edited version)

0

問題是,它不能代表某些整數,其量太大,

爲整數,[-9007199254740992,9007199254740992(2^53)可以準確度的可接受範圍。