【问题标题】:Prevent JavaScript Number function from rounding big numbers防止 JavaScript Number 函数舍入大数字
【发布时间】:2013-03-20 16:31:42
【问题描述】:

我有一个字符串值“9223372036854775807”。我在 JavaScript 中使用 Number() 函数使用以下代码将其转换为数字值

var numericVal = Number(' 9223372036854775807 ');

当我检查 numericVal 中的值时,它是 9223372036854776000。如何获得表示数字的字符串的等效值?

【问题讨论】:

标签: javascript


【解决方案1】:

JavaScript 编号为Double Precision Floats;可以精确存储的最大整数是 2^53 (9007199254740992)。 如果你真的需要它在一个数字中,你有一些有趣的数学在你面前,或者你可以使用一个库,比如big.js

【讨论】:

  • 我很困惑,因为输出的数字大于我给出的数字。如果它可以存储更大的值,它不能存储更小的值吗?
  • 抱歉,我贴错了 - 2^53 是 9007199254740992。它可以存储更高的值,只是不精确。
  • 但是 9223372036854776000 大于 9007199254740992 对。这个值是如何存储的?
  • 你说得对,它是一个更高的值,Double Precision Float 只能在 -2^53 和 2^53 之间精确。 JavaScript 将尝试存储数字,但由于对象类型,它无法准确。另请注意,JavaScript 算术运算符适用于 64 位,但按位和移位运算符适用于 32 位。如果您使用这种大小的数字,则需要使用非本地对象,例如 big.js
【解决方案2】:

您可以将表示大整数的字符串比较为字符串-

整数串越长越大,否则按顺序比较字符。

您可以对整数字符串数组进行排序

function compareBigInts(a, b){
    if(a.length== b.length) return a>b? 1:-1;
    return a.length-b.length;
}

或返回两个数字字符串中较大的一个

function getBiggestBigInts(a, b){
    if(a.length== b.length) return a>b? a:b;
    return a.length>b.length? a: b;
}

//例子

var n1= '9223372036854775807', n2= '9223372056854775807',
n3= '9223',n2= '9223372056854775817',n4= '9223372056854775';

getBiggestBigInts(n1,n2);>> 9223372056854775807

[n1,n2,n3,n4].sort(compareBigInts);>>

9223
9223372056854775
9223372036854775807
9223372056854775817

只要确保你在比较字符串

(如果你使用'-'减值,'更大'的字符串值是less

顺便说一句,您可以通过在小数点上拆分并比较整数部分来对大小数进行排序。如果整数长度相同且相等,请查看小数部分。

【讨论】:

    【解决方案3】:

    您的数字似乎大于 2^53,这是 javascript 中最大的整数,可以在不丢失精度的情况下表示(请参阅this question)。

    如果你真的需要操作大数,你可以使用像这样的特殊库:https://github.com/peterolson/BigInteger.js

    【讨论】:

    • 我只是想将这个数字与另一个数字进行比较。如果没有任何特殊的库,这可能吗?
    【解决方案4】:

    Number('9223372036854775807') 产生 9223372036854776000 的问题在于 JavaScript 的精度有限(最多 16 位),而您需要 19 位。

    其中一种解决方案可能是使用 java 脚本 big-numbers 库:

    // Initializa library:
    var bn = new BigNumbers();
    
    // Create numbers to compare:
    var baseNumber = bn.of('9223372036854775807');
    var toCompareNumber = bn.of('9223372036854775808');
    
    // Compare:
    if(baseNumber.lessOrEquals(toCompareNumber)) {
        console.log('This should be logged');
    } else {
        console.log('This should NOT be logged');
    }
    

    【讨论】:

      猜你喜欢
      • 2016-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-08
      • 1970-01-01
      • 2014-06-15
      相关资源
      最近更新 更多