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

IT技术 javascript frontend decimal number-formatting division
2021-02-06 23:04:27

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

我怎样才能做到这一点?

6个回答

你可以用...

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

Math.trunc()尚不支持所有平台(即 IE),但在此期间您可以轻松使用polyfill

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


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

必读 - 每个计算机科学家都应该了解的关于浮点运算的知识

以下显示此答案不稳定:> (2.305*100)|0 > 230 > (2.3*100)|0 > 229
2021-03-20 23:04:27
请记住,当 number 为Math.floor()增加数值因此同时如@FloydPink 所述)将按预期丢弃正数负数的小数部分Math.floor(-1.2) -> -2Math.floor(1.2) -> 1parseInt(-1.2) -> -1
2021-03-27 23:04:27
@Jake2.3*100在 javascript 中的结果229.99999999999997,因此在您的示例中,按位运算符似乎正确地完成了其工作。
2021-03-31 23:04:27
我不明白为什么IE没有涵盖这么棒的工具,Math.trunc()
2021-04-01 23:04:27
@PaulT.Rawkeen 您也可以使用按位运算符删除小数部分,但请记住,它也会截断为 32 位。
2021-04-10 23:04:27

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

例如

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

按位运算比数学函数高效得多。double not bitwise 运算符似乎也略胜于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);
}

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

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

关于双位非运算符的更多信息可以在双位非 (~~)

可能效率不高。但是,我建议使用“数学”函数,因为它更具可读性。
2021-03-13 23:04:27
如果这样做,请确保将按位运算包装在具有合理名称的函数中。否则要准备好让你的同事把你钉在十字架上。
2021-03-30 23:04:27
如果整数未表示为 32 位有符号整数 ( stackoverflow.com/a/7488075/3655192 ) ,则这可能不起作用
2021-04-04 23:04:27

你也可以这样做

parseInt(a/b)
请注意,parseInt对于大数,它不会可靠地工作,因为它首先将其参数转换为字符串,而对于大数,结果将使用指数表示法。例如:var n = 22222222222222222222222; parseInt(n);会返回2,因为会n.toString()返回2.2222222222222223e+22
2021-04-03 23:04:27
它也没有parseInt()用于它的目的,即在字符串中获取一个数字并返回一个Number.
2021-04-05 23:04:27

您还可以使用以下代码在小数点后显示一定数量的数字(此处为 2 位数):

var num = (15.46974).toFixed(2)
console.log(num) // 15.47
console.log(typeof num) // string

这是 OP 要求删除小数部分的答案
2021-03-16 23:04:27
虽然它返回一个字符串,但您可以使用 Number() 方法来纠正它.. Number((15.46974).toFixed(2))
2021-03-22 23:04:27
请注意 toFixed() 返回一个字符串,而不是一个数字。developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
2021-04-06 23:04:27

例如:

var x = 9.656;
x.toFixed(0);           // returns 10
x.toFixed(2);           // returns 9.66
x.toFixed(4);           // returns 9.6560
x.toFixed(6);           // returns 9.656000 

或者

parseInt("10");         // returns 10
parseInt("10.33");      // returns 10
parseInt("10 20 30");   // returns 10
parseInt("10 years");   // returns 10
parseInt("years 10");   // returns NaN  
我不明白为什么这个答案没有任何荣誉,它对我有用,并且已集成到 react/JavaScript 标准中
2021-04-06 23:04:27