为什么一些科学数字会自动舍入而另一些则不然?

时间:2012-06-06 03:07:29

标签: javascript numbers

为什么从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错误,但没有人回复。

现场演示: 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.");
    }
}

1 个答案:

答案 0 :(得分:3)

这是因为浮点数有时是近似值。有些数字不能用浮点格式表示,即二进制小数,因此它们近似为http://en.wikipedia.org/wiki/IEEE_754-2008

这就是为什么你不应该依赖于浮点运算而不对其进行舍入。一个简单的例子如下:

> 20.61 - .1
  20.509999999999998

以下是浮点格式http://www.randelshofer.ch/fhw/gri/float.html#chapterfloatingpointformat

的一个很好的解释

普通十进制 178.125

科学十进制 1.78125 E 102

Scientific Binary 1.0110010001 E 2111

相关问题