爲什麼從9.999999999999999開始的科學記數法中的某些數字四捨五入爲1而其他數字保持不變?爲什麼一些科學數字會自動舍入而其他數字不是?
例如,在Google Chrome 20中會發生以下情況。
(9.999999999999999e+306).toString() === "9.999999999999999e+306" // true
但
(9.999999999999999e+303).toString() === "1e+304" // true
這是爲什麼?這是浮點問題嗎?
然而奇怪的是,在Opera 11.64 (1e23).toString() === "9.999999999999999e+22"
。我試圖向Opera報告1e23錯誤,但沒有人回覆。
現場演示這裏:演示
var console = console || {};
console.logToBody = function(str){
document.body.innerHTML += "" + str + "<br/>";
};
var parts = ["9.999999999999999e", 310 ], tmp, tmp2;
while(parts[1]--){
tmp = +(parts.join(''));
if(/9.9{3,}e/.test(+tmp)){
console.logToBody(tmp + " doesn't convert to " + (+tmp).toPrecision(1));
}
tmp2 = "1e"+parts[1];
//Carakan Javascript Engine Math BUG:
if(!/^1e*/.test(+tmp2)){
console.logToBody(tmp2 + " = " + (+tmp2) + " in the runtime environment.");
}
}
因爲浮點數實際上是[非常大的分數的近似值](http://en.m.wikipedia.org/wiki/Double-precision_floating-point_format) –
@minitech:'9.999999999999999e + 22'是如何不同從'9.999999999999999e + 306'? – zerkms
@minitech不在歌劇中。 –