数字正在改变价值观

时间:2012-02-21 02:27:31

标签: javascript floating-point

之前我遇到过这个问题,但是有浮点数。与this other post相似。但现在这是正常的数字。

我试图这样做:

var 
    str = 'asdf_10150663120210603',
    num = +str.split('_')[1];

console.log(num);
// 10150663120210603 expected
// 10150663120210604 actually resulting

所以我试过,在Node& Chrome Inspector,只需输出数字。

console.log(10150663120210603);
// 10150663120210604 actually resulting

是否有任何疯狂的方式,无论是否为hackish,使变量等于10150663120210603。或者我必须使用字符串吗?

3 个答案:

答案 0 :(得分:3)

JavaScript中的浮点数是64位IEEE-754浮点值。它们只有52位用于尾数,你的数字需要54位来表示。它只是圆满了。

如果它舍入为10150663120210604,则可以用52位表示。

答案 1 :(得分:2)

JavaScript使用IEEE 754 double-precision floating-point format来表示所有数字,该格式可以精确表示最多2 ^ 52的整数。由于您的数字大于最大的可精确表示的整数,因此它会被舍入。

答案 2 :(得分:1)

JavaScript使用IEEE-754双精度(64位)格式表示数字。据我所知,这给你53位精度,或十五到十六位小数。您的号码比JavaScript可以处理的数字更多,因此您最终会得到近似值。

如果您不需要对数字进行任何数学运算,那么最简单的解决方法就是将它们表示为字符串。

否则,您可以使用big int library(或实施自己的)。