9.999999999999999で始まる科学的記数法の一部の数値が1に丸められ、他の数値は同じままであるのはなぜですか?
たとえば、GoogleChrome20では次のようになります。
(9.999999999999999e+306).toString() === "9.999999999999999e+306" // true
しかし
(9.999999999999999e+303).toString() === "1e+304" // true
何故ですか?浮動小数点の問題ですか?
ただし、最も奇妙なことは、Opera11.64のこと(1e23).toString() === "9.999999999999999e+22"
です。1e23のバグをOperaに報告しようとしましたが、誰も応答しませんでした。
ここでのライブデモ:http: //jsfiddle.net/3ekDK/3/
デモのソースコード
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.");
}
}