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函数是否接受数字作为数字对象或数字值?
答案 0 :(得分:7)
IEEE 754双精度二进制浮点格式(JavaScript用于 Number 类型的格式)为您提供15 - 17个有效十进制数的精度。
这给出了15到17个有效十进制数字的精度。如果一个 十进制字符串最多15个有效小数转换为 IEEE 754双精度然后转换回相同的数字 有效小数,那么最后的字符串应该匹配 原版的;如果IEEE 754双精度转换为a 十进制字符串,至少有17位有效小数,然后转换 返回加倍,然后最终的数字必须与原始[1]匹配。
答案 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)
请参阅此解决方法:
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));