【问题标题】:JavaScript Math.min returns wrong valueJavaScript Math.min 返回错误值
【发布时间】:2013-02-24 13:23:27
【问题描述】:

我正在使用John Resig's function 在数组中查找最小值,但它以某种方式返回了底值。 这是demo,这是代码。

 var arr = Math.min.apply(Math, [310127563311820800, 310127563190202368, 310127563110502401, 310127562443595776, 310127562326163457, 310127561751556097]);
document.write(arr);

你能解释一下会发生什么以及为什么它返回错误(下限)值吗?

【问题讨论】:

    标签: javascript arrays min


    【解决方案1】:

    问题不在于找到最小值,而在于使用这些数字。您不能在 JavaScript 中将它们表示为数字,因为整数只能完全保持在 -9007199254740992+9007199254740992 之间。

    这是因为 JavaScript 中的所有数字都是双精度 IEEE754 浮点数,尾数的大小是 53。

    ECMAScript specification on the number type查看更多详情:

    注意所有大小为 no 的正整数和负整数 大于 253 可以在 Number 类型中表示(实际上, 整数 0 有两种表示形式,+0 和 -0)。

    要处理这些数字(并找到它们的最小值),您需要使用原生 JavaScript 数字之外的另一种表示形式。希望有很多图书馆处理大数字,例如bignum(但你应该谷歌并选择你喜欢的那个)。

    【讨论】:

    • 是否有另一种方法可以在数字超过该区间的数组中找到最小值?
    【解决方案2】:

    除非你输入 strings 数字,否则你会失去 javascript 的精度。

    如果它们都是正整数,您可以对它们进行排序并返回索引最低的元素,记住数字多的字符串必须大于数字少的字符串-

    var input= ['310127563311820800', '310127563190202368', '310127563110502401',
    '310127562443595776', '310127562326163457', '310127561751556097'];
    
    
    var minim= input.slice(0).sort(function(a, b){
        if(a=== b) return 0;
        if(a.length!= b.length) return a.length-b.length;
        return a>b? 1:-1;  
    })[0];
    
    alert(minim);
    
    /*  returned value: (String)
    310127561751556097
    */
    

    如果您不需要保持原件的顺序,您可以跳过 slice(0) 位。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-27
      • 1970-01-01
      • 1970-01-01
      • 2019-02-03
      相关资源
      最近更新 更多