【发布时间】:2011-11-30 07:21:20
【问题描述】:
我有除法的结果,我希望舍弃结果数的小数部分。
我该怎么做?
【问题讨论】:
标签: javascript frontend decimal number-formatting division
我有除法的结果,我希望舍弃结果数的小数部分。
我该怎么做?
【问题讨论】:
标签: javascript frontend decimal number-formatting division
你可以使用...
Math.trunc()(截断小数部分,另见下文)Math.floor()(向下取整)Math.ceil()(四舍五入)Math.round()(四舍五入到最接近的整数)...取决于您要如何删除小数。
Math.trunc() 尚不支持所有平台(即 IE),但同时您可以轻松使用polyfill。
另一种截断小数部分并具有出色平台支持的方法是使用bitwise operator(例如|0)。对数字使用按位运算符的副作用是将其操作数视为带符号的 32 位整数,因此会删除小数部分。请记住,这也会破坏大于 32 位的数字。
您可能还在谈论浮点运算的十进制舍入的不准确性。
Required Reading - What Every Computer Scientist Should Know About Floating-Point Arithmetic.
【讨论】:
Math.floor() 将增加数值。因此Math.floor(-1.2) -> -2 而Math.floor(1.2) -> 1。 parseInt(-1.2) -> -1(@FloydPink 提到)将按预期丢弃 正数 和 负数 数的小数部分。
> (2.305*100)|0 > 230 > (2.3*100)|0 > 229
2.3*100 在 javascript 中的结果是 229.99999999999997,因此在您的示例中,位运算符似乎正确地完成了它的工作。
Math.trunc()!
使用Math.round()。
(亚历克斯的回答更好;我做了一个假设:)
【讨论】:
你也可以这样做
parseInt(a/b)
【讨论】:
parseInt 不能可靠地用于大数,因为它首先将其参数转换为字符串,而对于大数,结果将使用指数表示法。例如:var n = 22222222222222222222222; parseInt(n); 将返回2,因为n.toString() 返回2.2222222222222223e+22。
parseInt() 来实现它的目的,即在字符串中获取一个数字并返回一个Number。
使用Math.round() 函数。
Math.round(65.98) // will return 66
Math.round(65.28) // will return 65
【讨论】:
$.round = Math.round ;)
Math.round 并没有真正回答这个问题。问题是如何忽略数字的小数部分。在此处答案显示的示例中,OP 希望在两种情况下都返回 65。 Math.round 将返回 66 或 65(如上所述)。
你也可以使用以下代码显示小数点后的一定位数(这里是2位):
var num = (15.46974).toFixed(2)
console.log(num) // 15.47
console.log(typeof num) // string
【讨论】:
toFixed 的行为类似于圆形。
对于类似地板的行为,请使用 %:
var num = 3.834234;
var floored_num = num - (num % 1); // floored_num will be 3
【讨论】:
对于 ES2015,Math.trunc() 可用。
Math.trunc(2.3) // 2
Math.trunc(-2.3) // -2
Math.trunc(22222222222222222222222.3) // 2.2222222222222223e+22
Math.trunc("2.3") // 2
Math.trunc("two") // NaN
Math.trunc(NaN) // NaN
IE11 或更低版本不支持它,但在 Edge 和其他所有现代浏览器中都可以使用。
【讨论】:
Math.trunc(value * Math.pow(10,x)) / Math.pow(10,x) 会起作用是不是太天真了?
value = 2.3 和 x = 2 将返回 2.29。我没有更好的建议。
您还可以使用位运算符来截断小数。
例如
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
按位运算比数学函数效率高得多。双非按位运算符似乎也比x | 0 和x << 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
更多关于双位非运算符的信息可以在Double bitwise NOT (~~)找到
【讨论】:
对于 ES6 实现,请使用如下内容:
const millisToMinutesAndSeconds = (millis) => {
const minutes = Math.floor(millis / 60000);
const seconds = ((millis % 60000) / 1000).toFixed(0);
return `${minutes}:${seconds < 10 ? '0' : ''}${seconds}`;
}
【讨论】:
这是在上述帖子的帮助下详细解释的压缩:
1. Math.trunc() : 用于删除后面跟点的数字。它隐式转换。但是,在 IE 中不支持。
例子:
Math.trunc(10.5) // 10
Math.trunc(-10.5) // -10
其他替代方式:使用按位非运算符:
例子:
x= 5.5
~~x // 5
2。 Math.floor() : 用于给出最小整数值posible。所有浏览器都支持它。
例子:
Math.floor(10.5) // 10
Math.floor(-10.5) // -11
3。 Math.ceil() : 用于给出可能的最高整数值。所有浏览器都支持它。
例子:
Math.ceil(10.5) // 11
Math.ceil(-10.5) // -10
4. Math.round() : 四舍五入到最接近的整数。所有浏览器都支持它。
例子:
Math.round(10.5) // 11
Math.round(-10.5)// -10
Math.round(10.49) // 10
Math.round(-10.51) // -11
【讨论】:
这是为那些想要阻止用户输入十进制数字的人准备的
<input id="myInput" onkeyup="doSomething()" type="number" />
<script>
function doSomething() {
var intNum = $('#myInput').val();
if (!Number.isInteger(intNum)) {
intNum = Math.round(intNum);
}
console.log(intNum);
}
</script>
【讨论】:
如果您不关心路由,只需将数字转换为字符串,然后删除句点之后的所有内容,包括句点。无论有没有小数,这都有效。
const sEpoch = ((+new Date()) / 1000).toString();
const formattedEpoch = sEpoch.split('.')[0];
【讨论】:
您可以使用 .toFixed(0) 删除完整的小数部分或在参数中提供您希望小数被截断的数字。
注意:toFixed 会将数字转换为字符串。
【讨论】:
例如:
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
【讨论】:
Math.trunc() 和 ~~ 删除 decimal part 对 integer part 没有任何影响。
例如:
console.log(Math.trunc(3.9)) // 3
console.log(~~(3.9)) // 3
【讨论】: