如何在 Javascript 中舍入一个数字?

IT技术 javascript math rounding
2021-03-20 20:07:37

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

math.round() 不起作用,因为它会将其四舍五入到最接近的小数。

我不确定是否有更好的方法来做到这一点,而不是在小数点处将其分开以保留第一位。必须有...

6个回答

使用Math.floor()是这样做的一种方式。

更多信息:https : //developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/floor

这也是最慢的方法;如果您需要执行很多这样的操作,请使用按位 | 操作员(见我的帖子)。
2021-05-03 20:07:37
| 运算符也向零舍入,而不是负无穷大。
2021-05-09 20:07:37

向负无穷大舍入 - 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()
@George 巨大还是巨大?:D
2021-04-21 20:07:37
谢谢你的完整性,但大写是错误的......而且在java脚本中产生了巨大的差异。否则我会在这里投票。
2021-05-02 20:07:37
我已经更新了答案,现在大写是正确的。
2021-05-08 20:07:37
您可以通过 获得与舍入到零相同的效果x | 0
2021-05-20 20:07:37

Math.floor()会工作,但与使用按位OR运算相比它非常慢

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

编辑 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 );
无法与您的数据争论 :) 我想我可能将 JS 的实现与 ActionScript 的(基于 EcmaScript 构建;显然实现不同)混淆了。感谢您检查我的工作!
2021-04-23 20:07:37
???我刚刚运行了使用 Spidermonkey 1.7 的 jsdb (www.jsdb.org),并运行了一个循环来总结 100000 个浮点数数组上 x[i] 的下限值,首先是 Math.floor(),然后按位或按照您的建议。大约花费了 125 毫秒的时间。
2021-04-30 20:07:37
所以我看不出 1.25usec 有多慢。
2021-05-04 20:07:37
只是用 500000 个浮点数重复了测试,它花费了大约相同的时间,大约 625 毫秒。
2021-05-12 20:07:37
他们也不做同样的事情。|转换为 32 位整数,截断;Math.floor向下舍入。jsfiddle.net/minitech/UVG2w
2021-05-17 20:07:37

如果您需要四舍五入到特定的小数位数,您可以尝试使用此功能

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
我认为像这样的单线不需要功能。
2021-04-27 20:07:37
roundDown(4.56, 2) 给你 4.55,所以我认为这不是一个好的解决方案。
2021-05-07 20:07:37

可以通过减去其带符号的小数部分来实现numbera 的舍入0(又名“截断其小数部分”)number % 1

rounded = number - number % 1;

就像Math.floor(向 舍入-Infinity)这种方法是完全准确的。

有在处理分歧-0+Infinity并且-Infinity尽管:

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

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

Math.floor(-Infinity)     => -Infinity
-Infinity - -Infinity % 1 => NaN
很好的答案!也许它应该说“向零截断数字”而不是“四舍五入......”
2021-04-23 20:07:37