Answers:
你可以用...
Math.trunc()
(截断小数部分,另请参见下文)Math.floor()
(向下取整)Math.ceil()
(围捕) Math.round()
(四舍五入到最接近的整数)...取决于您要删除小数的方式。
Math.trunc()
目前尚不支持所有平台(即IE),但与此同时,您可以轻松使用polyfill。
在出色的平台支持下截断小数部分的另一种方法是使用按位运算符(.eg |0
)。在数字上使用按位运算符的副作用是它将其操作数视为有符号的32位整数,因此删除了小数部分。请记住,这还会破坏大于32位的数字。
您可能还在谈论浮点算术十进制舍入的不准确性。
> (2.305*100)|0 > 230 > (2.3*100)|0 > 229
2.3*100
javascript中的结果是229.99999999999997
,因此在您的示例中似乎按位运算符正在正确执行其工作。
|0
使用64位整数的类似解决方案?
您还可以使用按位运算符来截断小数。
例如
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
有关双按位非运算符的更多信息,请参见双按位非(~~)
您还可以使用以下代码在小数点后显示一定位数(此处为2位):
var num = (15.46974).toFixed(2)
console.log(num) // 15.47
console.log(typeof num) // string
使用Math.round()
功能。
Math.round(65.98) // will return 66
Math.round(65.28) // will return 65
$.round = Math.round
;)
使用Math.round()
。
(亚历克斯的答案更好;我做了一个假设:)
在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
。我没有更好的建议。
toFixed的行为类似于回合。
对于类似行为的地板,请使用%:
var num = 3.834234;
var floored_num = num - (num % 1); // floored_num will be 3
这是在以上文章的帮助下进行的详细解释:
1. Math.trunc():用于删除那些后跟点的数字。它隐式转换。但是,IE不支持。
例:
Math.trunc(10.5)// 10
Math.trunc(-10.5)// -10
其他替代方式:使用按位非运算符:
例:
x = 5.5
~~ x // 5
2. Math.floor():用于给出可能的最小整数值。所有浏览器均支持。
例:
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>
您可以使用.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.floor()
会增加数值。因此而。(如@FloydPink所述)将按预期丢弃正数和负数的小数部分。Math.floor(-1.2) -> -2
Math.floor(1.2) -> 1
parseInt(-1.2) -> -1