【发布时间】:2011-07-03 10:07:46
【问题描述】:
为什么10000000000000.126.toString() 1000000000000.127 和100000000000.126.toString() 不是?
我认为它必须与 Js 中 Number 的最大值有关(根据this SO question),但这与浮点运算有关吗?
我之所以问这个问题,是因为我编写了这个函数来使用千位分隔符格式化一个数字,并希望防止这种情况发生。
function th(n,sep) {
sep = sep || '.';
var dec = n.toString().split(/[,.]/),
nArr = dec[0].split(''),
isDot = /\./.test(sep);
return function tt(n) {
return n.length > 3 ?
tt(n.slice(0,n.length-3)).concat(n.slice(n.length-3).join('')) :
[n.join('')]
;
}(nArr)
.join(sep)
+ (dec[1] ? (isDot?',':'.') + dec[1] : '');
}
sep1000(10000000000000.126); //=> 10.000.000.000.000,127
sep1000(1000000000000.126); //=> 1.000.000.000.000,126
【问题讨论】:
-
这是因为我们的好老朋友浮点精度。
-
@Alnitak,我知道,但另外我正在寻找一种方法来防止它。我还在寻找相关的答案,真的。
-
@KooiInc:我完全不确定你可以,虽然你可以通过改变
Number试图表示的数字的大小来玩游戏,这可能会让你访问到更多数据。我已经用一个例子更新了我的答案(这很可能是有缺陷的)。
标签: javascript numbers floating-point