4

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.");
    }
}
4

1 に答える 1

3

これは、浮動小数点数が近似値である場合があるためです。一部の数値は浮動小数点形式、つまり2進数で表すことができないため、概算されますhttp://en.wikipedia.org/wiki/IEEE_754-2008

そのため、丸めずに浮動小数点演算に依存することはできません。簡単な例は次のとおりです。

> 20.61 - .1
  20.509999999999998

浮動小数点形式の優れた説明は次のとおりですhttp://www.randelshofer.ch/fhw/gri/float.html#chapterfloatingpointformat

通常の10進 数178.125

科学10進 数1.78125E102

サイエンティフィックバイナリ 1.0110010001E2111

于 2012-06-06T03:10:36.473 に答える