如何从JavaScript数字中删除小数部分?

我有一个除法的结果,我希望丢弃结果数的小数部分。

我该怎么做?


答案 1

您可以使用...

...取决于你想要如何删除小数。

Math.trunc()目前并非所有平台(即IE)都受支持,但在此期间,您可以轻松使用polyfill

截断具有出色平台支持的小数部分的另一种方法是使用按位运算符(.例如 )。对数字使用按位运算符的副作用是,它会将其操作数视为有符号的 32 位整数,从而删除小数分量。请记住,这也会破坏大于 32 位的数字。|0


您可能还在谈论使用浮点算术进行小数舍入的不准确性。

必读 - 每个计算机科学家都应该知道的浮点算术


答案 2

您还可以使用按位运算符截断小数点。

例如:

var x = 9 / 2;
console.log(x); // 4.5

x = ~~x;
console.log(x); // 4

x = -3.7
console.log(~~x) // -3
console.log(x | 0) // -3
console.log(x << 0) // -3

按位运算比 Math 函数的效率高得多。双精度非按位运算符似乎也略微优于按位操作,可以忽略不计。x | 0x << 0

// 952 milliseconds
for (var i = 0; i < 1000000; i++) {
    (i * 0.5) | 0;
}

// 1150 milliseconds
for (var i = 0; i < 1000000; i++) {
    (i * 0.5) << 0;
}

// 1284 milliseconds
for (var i = 0; i < 1000000; i++) {
    Math.trunc(i * 0.5);
}

// 939 milliseconds
for (var i = 0; i < 1000000; i++) {
    ~~(i * 0.5);
}

同样值得注意的是,按位 not 运算符优先于算术运算,因此您可能需要用括号将计算括起来才能获得预期结果:

x = -3.7

console.log(~~x * 2) // -6
console.log(x * 2 | 0) // -7
console.log(x * 2 << 0) // -7

console.log(~~(x * 2)) // -7
console.log(x * 2 | 0) // -7
console.log(x * 2 << 0) // -7

有关双按位不运算符的更多信息,请参阅双按位 NOT (~~)