我想在 JavaScript 中将浮点数转换为整数。实际上,我想知道如何进行两种标准转换:截断和舍入。并且有效地,而不是通过转换为字符串和解析。
如何在 JavaScript 中将浮点数转换为整数?
IT技术
javascript
syntax
2021-02-09 04:26:04
6个回答
var intvalue = Math.floor( floatvalue );
var intvalue = Math.ceil( floatvalue );
var intvalue = Math.round( floatvalue );
// `Math.trunc` was added in ECMAScript 6
var intvalue = Math.trunc( floatvalue );
例子
积极的// value=x // x=5 5<x<5.5 5.5<=x<6
Math.floor(value) // 5 5 5
Math.ceil(value) // 5 6 6
Math.round(value) // 5 5 6
Math.trunc(value) // 5 5 5
parseInt(value) // 5 5 5
~~value // 5 5 5
value | 0 // 5 5 5
value >> 0 // 5 5 5
value >>> 0 // 5 5 5
value - value % 1 // 5 5 5
消极的
// value=x // x=-5 -5>x>=-5.5 -5.5>x>-6
Math.floor(value) // -5 -6 -6
Math.ceil(value) // -5 -5 -5
Math.round(value) // -5 -5 -6
Math.trunc(value) // -5 -5 -5
parseInt(value) // -5 -5 -5
value | 0 // -5 -5 -5
~~value // -5 -5 -5
value >> 0 // -5 -5 -5
value >>> 0 // 4294967291 4294967291 4294967291
value - value % 1 // -5 -5 -5
正 - 更大的数字
// x = Number.MAX_SAFE_INTEGER/10 // =900719925474099.1
// value=x x=900719925474099 x=900719925474099.4 x=900719925474099.5
Math.floor(value) // 900719925474099 900719925474099 900719925474099
Math.ceil(value) // 900719925474099 900719925474100 900719925474100
Math.round(value) // 900719925474099 900719925474099 900719925474100
Math.trunc(value) // 900719925474099 900719925474099 900719925474099
parseInt(value) // 900719925474099 900719925474099 900719925474099
value | 0 // 858993459 858993459 858993459
~~value // 858993459 858993459 858993459
value >> 0 // 858993459 858993459 858993459
value >>> 0 // 858993459 858993459 858993459
value - value % 1 // 900719925474099 900719925474099 900719925474099
负数 - 更大的数字
// x = Number.MAX_SAFE_INTEGER/10 * -1 // -900719925474099.1
// value = x // x=-900719925474099 x=-900719925474099.5 x=-900719925474099.6
Math.floor(value) // -900719925474099 -900719925474100 -900719925474100
Math.ceil(value) // -900719925474099 -900719925474099 -900719925474099
Math.round(value) // -900719925474099 -900719925474099 -900719925474100
Math.trunc(value) // -900719925474099 -900719925474099 -900719925474099
parseInt(value) // -900719925474099 -900719925474099 -900719925474099
value | 0 // -858993459 -858993459 -858993459
~~value // -858993459 -858993459 -858993459
value >> 0 // -858993459 -858993459 -858993459
value >>> 0 // 3435973837 3435973837 3435973837
value - value % 1 // -900719925474099 -900719925474099 -900719925474099
按位或运算符
按位或运算符可用于截断浮点数,它适用于正数和负数:
function float2int (value) {
return value | 0;
}
结果
float2int(3.1) == 3
float2int(-3.1) == -3
float2int(3.9) == 3
float2int(-3.9) == -3
性能对比?
我创建了一个JSPerf 测试来比较以下之间的性能:
Math.floor(val)
val | 0
按位或~~val
按位非parseInt(val)
这只适用于正数。在这种情况下,您可以安全地使用按位运算以及Math.floor
函数。
但是如果你需要你的代码处理正数和负数,那么按位运算是最快的(或者是首选的)。另一个 JSPerf 测试进行了比较,很明显,由于额外的符号检查,Math 现在是四个中最慢的。
笔记
如评论中所述,BITWISE 运算符对有符号的 32 位整数进行操作,因此将转换大数,例如:
1234567890 | 0 => 1234567890
12345678901 | 0 => -539222987
注意:您不能Math.floor()
用作 truncate 的替代品,因为Math.floor(-3.1) = -4
and not -3
!!
truncate 的正确替换是:
function truncate(value)
{
if (value < 0) {
return Math.ceil(value);
}
return Math.floor(value);
}
双按位非运算符可用于截断浮点数。你提到的其他操作都可以通过Math.floor
,Math.ceil
和Math.round
。
> ~~2.5
2
> ~~(-1.4)
-1
对于截断:
var intvalue = Math.floor(value);
对于回合:
var intvalue = Math.round(value);