8
    ​document.writeln(Math.floor(43.9));

​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​则则是却又在浏览器中产生了43。

​document.writeln(Math.floor(43.9999));​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​

生产 43

 ​document.writeln(Math.floor(43.999999999999));​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​ 

再次 43

然而,

    document.writeln(Math.floor(43.99999999999999));

产生44。

小数点后 9 的幻数似乎是 15*。

为什么是这样?

此外, Math.floor 函数是否接受数字作为数字对象或数字值?

4

5 回答 5

7

IEEE 754 双精度二进制浮点格式(这是 JavaScript 用于其Number类型的格式)为您提供 15 - 17 位有效十进制数字的精度。

这给出了 15 - 17 位有效十进制数字的精度。如果将最多 15 位有效小数的十进制字符串转换为 IEEE 754 双精度,然后再转换回相同的有效小数位数,则最终字符串应与原始字符串匹配;如果将 IEEE 754 双精度转换为具有至少 17 位有效小数的十进制字符串,然后再转换回双精度,则最终数字必须与原始数字 [1] 匹配。

来源:http ://en.wikipedia.org/wiki/Double-precision_floating-point_format#IEEE_754_double-precision_binary_floating-point_format:_binary64

于 2012-08-14T18:26:49.943 回答
5

双精度浮点数(又名双精度数)能够存储范围非常广泛的值,但精度有限——15-17 位有效数字。如果您执行以下操作,您将看到会发生什么:

var x = 43.99999999999999;
var y = 43.999999999999999;

document.writeln(x); // 43.99999999999999
document.writeln(y); // 44
document.writeln(Math.floor(x)); // 43
document.writeln(Math.floor(y)); // 44

您也会在其他语言中看到相同的内容。例如,PHP:

echo floor(43.99999999999999); // 43
echo floor(43.999999999999999); // 44
于 2012-08-14T18:27:11.780 回答
2

在 Chrome 中,如果我只是43.99999999999999999999999在控制台中输入,它会输出44,这可能就是您遇到的问题。浮点数是近似值

于 2012-08-14T18:21:43.177 回答
1

您可以同时传递 Number 的实例以及数字文字。

Math.floor(43.99999999999999);

Math.floor(new Number(43.99999999999999));
于 2012-08-16T13:19:12.007 回答
1

请参阅此解决方法:

http://jsfiddle.net/k7huV/3/

var x = 43;
for( var i = 0; i < 16; i++ ){
    if( i == 0 ) x += ".";
    x += "9";   
}
document.writeln(x);
document.writeln(parseInt(x));

输出:43.9999999999999999 43

正确楼层 43.999999999999999 至 43。

于 2012-08-14T18:25:02.520 回答