Javascript Math.floor函数错误或实现之谜?

时间:2012-08-14 18:13:38

标签: javascript

    ​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函数是否接受数字作为数字对象或数字值?

5 个答案:

答案 0 :(得分:7)

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

  

这给出了15到17个有效十进制数字的精度。如果一个   十进制字符串最多15个有效小数转换为   IEEE 754双精度然后转换回相同的数字   有效小数,那么最后的字符串应该匹配   原版的;如果IEEE 754双精度转换为a   十进制字符串,至少有17位有效小数,然后转换   返回加倍,然后最终的数字必须与原始[1]匹配。

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

答案 1 :(得分:5)

Double-precision floating point numbers(a.k.a。双打)能够存储范围非常广泛的值,但只能使用有限的精度 - 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

答案 2 :(得分:2)

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

答案 3 :(得分: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。

答案 4 :(得分:1)

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

Math.floor(43.99999999999999);

Math.floor(new Number(43.99999999999999));