如何在JavaScript中四舍五入一个数字?

Math.round()不起作用,因为它舍入到最接近的小数。

我不确定是否有更好的方法,而不是在小数点处分开,保留第一位。一定有……


当前回答

要四舍五入到负无穷,可以使用:

rounded=Math.floor(number);

要四舍五入到零(如果数字可以四舍五入到-2147483648和2147483647之间的32位整数),使用:

rounded=number|0;

要四舍五入到零(对于任何数字),使用:

if(number>0)rounded=Math.floor(number);else rounded=Math.ceil(number);

其他回答

朝向负无穷- Math.floor()

+3.5 => +3.0
-3.5 => -4.0

可以使用Math.trunc()向零舍入。旧的浏览器不支持此功能。如果需要支持这些,可以使用Math.ceil()表示负数,使用Math.floor()表示正数。

+3.5 => +3.0 using Math.floor()
-3.5 => -3.0 using Math.ceil()

将一个数字舍入到0(又名“截断其小数部分”)可以通过减去其带符号的小数部分数字% 1来完成:

rounded = number - number % 1;

喜欢数学。floor(四舍五入到-∞)这个方法是完全准确的。

-0, +∞和-∞的处理是不同的:

Math.floor(-0) => -0
-0 - -0 % 1    => +0

Math.floor(Infinity)    => Infinity
Infinity - Infinity % 1 => NaN

Math.floor(-Infinity)     => -Infinity
-Infinity - -Infinity % 1 => NaN

如果需要四舍五入到特定的小数点后数位,可以尝试使用此函数

function roundDown(number, decimals) {
    decimals = decimals || 0;
    return ( Math.floor( number * Math.pow(10, decimals) ) / Math.pow(10, decimals) );
}

例子

alert(roundDown(999.999999)); // 999
alert(roundDown(999.999999, 3)); // 999.999
alert(roundDown(999.999999, -1)); // 990

要四舍五入到负无穷,可以使用:

rounded=Math.floor(number);

要四舍五入到零(如果数字可以四舍五入到-2147483648和2147483647之间的32位整数),使用:

rounded=number|0;

要四舍五入到零(对于任何数字),使用:

if(number>0)rounded=Math.floor(number);else rounded=Math.ceil(number);

Math.floor()可以工作,但与使用按位或操作相比,它非常慢:

var rounded = 34.923 | 0;
alert( rounded );
//alerts "34"

EDIT Math.floor()并不比使用|操作符慢。感谢Jason S检查我的工作。

下面是我用来测试的代码:

var a = [];
var time = new Date().getTime();
for( i = 0; i < 100000; i++ ) {
    //a.push( Math.random() * 100000  | 0 );
    a.push( Math.floor( Math.random() * 100000 ) );
}
var elapsed = new Date().getTime() - time;
alert( "elapsed time: " + elapsed );