防止JavaScript数字函数舍入大数字

时间:2013-03-20 16:31:43

标签: javascript

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

var numericVal = Number(' 9223372036854775807 ');

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

4 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:3)

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

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

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

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);&GT;&GT; 9223372056854775807

<强> [N1,N2,N3,N4]的.sort(compareBigInts);&GT;&GT;

9223
9223372056854775
9223372036854775807
9223372056854775817

确保您正在比较字符串

(如果您使用&#39; - &#39;减去值,则字符串值越大

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

为什么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');
}