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


当前回答

我只想指出,在金钱上,你想要圆,而不是截断。因为4.999452*100四舍五入会给你5,一个更具代表性的答案,所以少一分钱的可能性要小得多。

最重要的是,不要忘了银行家的舍入,这是一种抵消直接舍入带来的轻微正偏差的方法——您的金融应用可能需要它。

JavaScript中的高斯/银行家舍入

其他回答

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

var intValue = parseInt(floatValue, 10);

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

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

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

假设您有以下数字:

const myValue = 56.4534931;

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

const rounded = Math.floor(myValue);

你会得到:

56

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

const roundedUp = Math.ceil(myValue);

你会得到:

57

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

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

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

按位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

函数返回小于或等于给定数字的最大整数。console.log('数学楼层:',数学楼层(3.5));console.log('数学楼层:',数学楼层(-3.5));Math.ceil()函数始终将数字舍入到下一个最大整数。console.log('Math.ceil:',Math.ceil(3.5));console.log('Math.ceil:',Math.ceil(-3.5));函数的作用是返回舍入到最接近整数的数值。console.log('Math.round:',Math.round(3.5));console.log('Math.round:',Math.round(-3.5));函数的作用是通过删除任何小数来返回数字的整数部分。console.log('Math.trunc:',Math.ttrunc(3.5));console.log('Math.trunc:',Math.ttrunc(-3.5));

这里有很多建议。按位OR似乎是迄今为止最简单的。下面是另一个简短的解决方案,它也可以使用模运算符处理负数。它可能比按位OR更容易理解:

intval = floatval - floatval%1;

此方法也适用于“|0”、“~~”或“>>0”都不能正常工作的高值数字:

> n=4294967295;
> n|0
-1
> ~~n
-1
> n>>0
-1
> n-n%1
4294967295