【问题标题】:Float: Breakpoint when increasing by 1 does nothing浮点数:加 1 时的断点不执行任何操作
【发布时间】:2014-06-10 05:53:29
【问题描述】:

浮点数是数字的近似值。

12345678901234567890 === 12345678901234567891true

同时

1234567890 === 1234567891false

num === num+1所在的断点是什么?

我编写了这段代码来找出它,但它需要的时间太长了......

for(var i = 0;;){
    var old = i;
    if(++i === old) break;
}
console.log(i);

【问题讨论】:

    标签: javascript floating-point numbers


    【解决方案1】:

    断点是253

    console.log(9007199254740992 === 9007199254740993);
    # true
    console.log(9007199254740991 === 9007199254740992);
    # false
    

    【讨论】:

    • 好的,谢谢。负数也一样。顺便说一句,您是如何找到它的?
    【解决方案2】:

    检查控制台中的数字。您将看到第一个示例在第 17 位之后被截断。

    Here's documentation 的 JavaScript 浮点数。

    【讨论】:

    • 这并没有回答问题,而且它给人的印象是浮点舍入的工作原理相当误导。
    【解决方案3】:

    通过反复试验找到断点:9007199254740991、9007199254740992

    var n = 1;
    while (true) {
        n *= 2;
        if (n === n+1) {
            break;
        }
    }
    
    var a = Math.round(n/2);
    var b = n;
    while (a < b-1) {
        var m = Math.round((a + b) / 2);
        if (m === m+1) {
            b = m;
        } else {
            a = m;
        }
    }
    console.log(a);
    console.log(b);
    

    演示:http://jsfiddle.net/gEdRh/

    【讨论】:

      猜你喜欢
      • 2012-08-01
      • 2017-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-21
      • 1970-01-01
      • 2014-01-25
      相关资源
      最近更新 更多