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


当前回答

还有一种可能的方法-使用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/

其他回答

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

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

JavaScript中的高斯/银行家舍入

在您的例子中,当您希望在末尾插入字符串(以便插入逗号)时,也可以只使用Number.toFixed()函数,但这将执行舍入。

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

注意:不能使用Math.floor()代替truncate,因为Math.floof(-3.1)=-4而不是-3!!

truncate的正确替换为:

function truncate(value)
{
    if (value < 0) {
        return Math.ceil(value);
    }

    return Math.floor(value);
}

如果您使用angularjs,那么简单的解决方案如下HTML模板绑定

{{val |编号:0}}

它会将val转换为整数

通过链接docs.angularjs.org/api/ng/filter/number