javascript - 为什么有些科学数字会自动四舍五入而有些则不会?

标签 javascript numbers

为什么科学计数法中有些以 9.999999999999999 开头的数字四舍五入为 1 而有些则保持不变?

例如,在 Google Chrome 20 中会发生以下情况。

(9.999999999999999e+306).toString() === "9.999999999999999e+306"//true

但是

(9.999999999999999e+303).toString() === "1e+304"//true

这是为什么呢?是 float 问题吗?

然而,最奇怪的是在 Opera 11.64 (1e23).toString() === "9.999999999999999e+22" 中。我试图向 Opera 报告 1e23 错误,但没有人回复。

现场演示: http://jsfiddle.net/3ekDK/3/

Demo源码

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

最佳答案

这是因为 float 有时是一个近似值。有些数不能用 float 表示,即二进制小数,所以近似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

科学二进制 1.0110010001 E 2111

关于javascript - 为什么有些科学数字会自动四舍五入而有些则不会?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10907671/

相关文章:

javascript - 如何在javascript中划分两个数字

javascript - 使用 onmouseover 将文本超链接更改为图像超链接?

Javascript:按数组的第一个字符排序

c - C 中的素数和阶乘

javascript - 直接从url下载图片

c - 测试 C 中字符串中的数字

Python 格式十进制接近零

javascript - 使用javascript调整div和背景的大小

javascript - 从选择列表中选择一个选项时如何触发 Vue 事件

javascript - Ckeditor 删除空标签