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