我想在JavaScript中将浮点数转换为整数。实际上,我想知道如何进行两种标准转换:通过截断和舍入。而且高效,而不是通过转换为字符串和解析。


当前回答

双位not运算符可用于截断浮点数。您提到的其他操作可通过Math.floor、Math.ceil和Math.round获得。

> ~~2.5
2
> ~~(-1.4)
-1

更多细节由詹姆斯·帕多尔西提供。

其他回答

按位OR运算符

按位或运算符可用于截断浮点数字,它既适用于正数,也适用于负数:

function float2int (value) {
    return value | 0;
}

后果

float2int(3.1) == 3
float2int(-3.1) == -3
float2int(3.9) == 3
float2int(-3.9) == -3

性能比较?

我创建了一个JSPerf测试,用于比较以下各项之间的性能:

数学下限(val)val |0位“或”~~val按位NOTparseInt(val)

这只适用于正数。在这种情况下,可以安全地使用按位运算以及Math.floor函数。

但是如果你需要你的代码同时处理正和负,那么按位操作是最快的(OR是首选)。另一个JSPerf测试与之进行了比较,很明显,由于额外的符号检查,Math现在是四个测试中速度最慢的。

Note

如注释中所述,BITWISE运算符对有符号的32位整数进行运算,因此将转换大数,例如:

1234567890  | 0 => 1234567890
12345678901 | 0 => -539222987

如果查看JavaScript中的本机Math对象,您将得到一系列处理数字和值等的函数。。。

基本上,你想做的是非常简单的,并且是JavaScript中的原生代码。。。

假设您有以下数字:

const myValue = 56.4534931;

现在,如果您想将其舍入到最接近的数字,只需执行以下操作:

const rounded = Math.floor(myValue);

你会得到:

56

如果要将其舍入到最接近的数字,只需执行以下操作:

const roundedUp = Math.ceil(myValue);

你会得到:

57

此外,Math.round将其舍入为更高或更低的数字取决于哪个更接近flot数。

此外,还可以在浮点数后面使用~~,这会将浮点数转换为整数。

你可以像~~myValue一样使用它。。。

您可以使用parseInt方法进行无舍入。由于0x(十六进制)和0(八进制)前缀选项,请小心用户输入。

var intValue = parseInt(floatValue, 10);

编辑:作为警告(来自注释部分),请注意某些数值将被转换为指数形式,如1e21,这将导致“1”的十进制表示不正确

还有一种可能的方法-使用XOR运算:

console.log(12.3^0);//12console.log(“12.3”^0);//12console.log(1.2+1.3^0);//2.console.log(1.2+1.3*2^0);//3.console.log(-1.2^0);//-1.console.log(-1.2+1^0);//0console.log(-1.2-1.3^0);//-2.

按位运算的优先级低于数学运算的优先级,这很有用。试穿https://jsfiddle.net/au51uj3r/

比特移位0,等于除以1

// >> or >>>
2.0 >> 0; // 2
2.0 >>> 0; // 2