【问题标题】:Comparing numeric values in JavaScript比较 JavaScript 中的数值
【发布时间】:2011-12-04 05:43:57
【问题描述】:

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

【问题讨论】:

    标签: javascript floating-point integer


    【解决方案1】:

    关于 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" 对舍入误差进行了很好的讨论。

    【讨论】:

      【解决方案2】:

      问题是它不能表示某些太大的整数,

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

      【讨论】:

        【解决方案3】:

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

        ECMAScript 具有以下数据类型:Undefined、Null、Boolean、 字符串、数字和对象。 (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 使用(类型)标记的数据 价值观。整数 ∈ [-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)

        【讨论】:

          【解决方案4】:

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

          【讨论】:

          • JavaScript 没有单独的整数和浮点数类型。整数是Numbers。浮点数也是Numbers。
          • 我明白,但你可以把它们当作'int's
          猜你喜欢
          • 2016-07-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-11-09
          相关资源
          最近更新 更多