比较JavaScript中的数值

时间:2011-10-10 04:08:42

标签: javascript floating-point integer

我的印象是数值存储为浮点数。使用任何其他语言比较浮点数是否相等是不可靠的,不推荐使用。幕后是否有一些魔法可以使这项工作可靠地用于整数?我找不到任何其他的参考。

4 个答案:

答案 0 :(得分:2)

你认为JS中的数字是浮点数是正确的。语言规范的4.3.19部分说

  

数值

     

原始值对应于双精度64位二进制格式IEEE 754值。

整数的浮点比较工作得很好。 64b IEEE-754可以精确地表示幅度小于2到53次幂的任何整数(见ULP)。除法或使用必须近似结果的Math函数时,问题就出现了。

如果确实需要将浮点运算的结果强制转换为最接近的整数,请使用Math.round

"What Every Computer Scientist Should Know about Floating Point"对舍入误差进行了很好的讨论。

答案 1 :(得分:0)

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

  

ECMAScript具有以下数据类型:Undefined,Null,Boolean,   字符串,数字和对象。 (TODO:解释ECMAScript类型系统 - 见   还有X部分:   http://www.cs.brown.edu/~sk/Publications/Books/ProgLangs/PDF/all.pdf   和http://c2.com/cgi/wiki?CategoryLanguageTyping

     

ECMAScript编号是64位二进制浮点数。 (对于   详情见 [ECMA-262])。 SpiderMonkey使用(类型)标记数据   值。整数∈[-2 ^(wordsize-1-1),2 ^(wordsize-1-1 [可以存储   直接在jsval(位移和标记)。其他ECMAScript号码   间接存储在双精度浮点数(   jsval存储指向double的标记指针。整数∈[-2 ^ 53,2 ^ 53]   可以精确地存储在双倍。1

中      

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

答案 2 :(得分:0)

问题是它不能代表某些过大的整数,

对于整数,[ - 9007199254740992,9007199254740992](2 ^ 53)是可接受的准确度范围。

答案 3 :(得分:-2)

如果您知道要比较的数字是整数,那么您宁愿将它们转换为整数(例如,如果它们可用作字符串,则使用parseInt(value))然后将它们作为整数进行比较。< / p>