【发布时间】:2011-12-04 05:43:57
【问题描述】:
我的印象是数值存储为浮点数。在任何其他语言中比较浮点数是否相等是不可靠的,不推荐使用。幕后是否有一些魔法可以使这项工作可靠地处理其他整数?我找不到任何其他参考。
【问题讨论】:
标签: javascript floating-point integer
我的印象是数值存储为浮点数。在任何其他语言中比较浮点数是否相等是不可靠的,不推荐使用。幕后是否有一些魔法可以使这项工作可靠地处理其他整数?我找不到任何其他参考。
【问题讨论】:
标签: javascript floating-point integer
关于 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" 对舍入误差进行了很好的讨论。
【讨论】:
问题是它不能表示某些太大的整数,
对于整数,[–9007199254740992, 9007199254740992] (2^53) 是可接受的精度范围。
【讨论】:
魔法: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 存储一个指向双精度的标记指针)。整数 ∈ [-2^53,2^53] 可以精确存储在double中。1
[1]What Every Computer Scientist Should Know About Floating-Point Arithmetic (edited version)
【讨论】:
如果您知道要比较的数字是整数,那么您宁愿将它们转换为整数(例如,如果它们可用作字符串,则使用 parseInt(value)),然后将它们作为整数本身进行比较。
【讨论】:
Numbers。浮点数也是Numbers。