如何在JavaScript中将浮点数转换为整数?

我想在JavaScript中将浮点数转换为整数。 其实,我想知道如何做标准的转换:截断和四舍五入。 有效地,不通过转换为一个string和parsing。

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 ); 

math对象引用


例子

 value = 5.5 Math.floor(value) // 5 Math.ceil(value) // 6 Math.round(value) // 6 Math.trunc(value) // 5 parseInt(value) // 5 ~~value // 5 value | 0 // 5 value >> 0 // 5 value >>> 0 // 5 value - value % 1 // 5 

 value = -5.5 Math.floor(value) // -6 Math.ceil(value) // -5 Math.round(value) // -5 Math.trunc(value) // -5 parseInt(value) // -5 value | 0 // -5 ~~value // -5 value >> 0 // -5 value >>> 0 // 4294967291 value - value % 1 // -5 

积极 – 数字较大

 value = Number.MAX_SAFE_INTEGER/10 // 900719925474099.1 Math.floor(value) // 900719925474099 Math.ceil(value) // 900719925474100 Math.round(value) // 900719925474099 Math.trunc(value) // 900719925474099 parseInt(value) // 900719925474099 value | 0 // 858993459 ~~value // 858993459 value >> 0 // 858993459 value >>> 0 // 858993459 value - value % 1 // 900719925474099 

负面 – 数字较大

 value = Number.MAX_SAFE_INTEGER/10 * -1 // -900719925474099.1 Math.floor(value) // -900719925474100 Math.ceil(value) // -900719925474099 Math.round(value) // -900719925474099 Math.trunc(value) // -900719925474099 parseInt(value) // -900719925474099 value | 0 // -858993459 ~~value // -858993459 value >> 0 // -858993459 value >>> 0 // 3435973837 value - value % 1 // -900719925474099 

按位或运算符

一个按位或运算符可以用来截断浮点数字,它可以用于正数和负数:

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

结果

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

性能比较?

我已经创build了一个JSPerftesting来比较下列性能:

  • Math.floor(val)
  • val | 0 val | 0 按位
  • ~~val 按位
  • parseInt(val)

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

但是,如果你需要你的代码来处理积极和消极 ,那么按位操作是最快的(OR是首选)。 这另一个JSPerftesting比较相同的地方,很明显,由于额外的符号检查math现在是四个最慢的。

注意

正如评论中所述,BITWISE运营商使用带符号的32位整数,因此大量数据将被转换,例如:

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

注意:您不能使用Math.floor()作为截断的替代,因为Math.floor(-3.1) = -4而不是-3

截断的正确替代将是:

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

双位不操作符可以用来截断浮动。 您提到的其他操作可通过Math.floorMath.ceilMath.round

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

更多细节由James Padolsey提供。

截断:

 var intvalue = Math.floor(value); 

对于一轮:

 var intvalue = Math.round(value); 

您可以使用parseInt方法不舍入。 由于0x(hex)和0(八进制)前缀选项,请谨慎使用用户input。

 var intValue = parseInt(floatValue, 10); 

相当于除以1的0位移位

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

在你的情况下,当你最后想要一个string(为了插入逗号),你也可以使用Number.toFixed()函数,但是,这将执行四舍五入。

这里有很多build议。 按位或似乎是迄今为止最简单的。 这里是另一个简短的解决scheme,使用模运算符和负数一起工作。 这可能比按位OR更容易理解:

 intval = floatval - floatval%1; 

这个方法也适用于没有“| 0”,“~~”和“>> 0”的高值数字:

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

还有一种可能的方式 – 使用XOR操作:

 console.log(12.3 ^ 0); // 12 console.log("12.3" ^ 0); // 12 console.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); // 0 console.log(-1.2 - 1.3 ^ 0); // -2 

按位运算的优先级小于math运算的优先级,这很有用。 尝试在https://jsfiddle.net/au51uj3r/

截断

 // Math.trunc() is part of the ES6 spec Math.trunc( 1.5 ); // returns 1 Math.trunc( -1.5 ); // returns -1 // Math.floor( -1.5 ) would return -2, which is probably not what you wanted 

 Math.round( 1.5 ); // 2 Math.round( 1.49 ); // 1 Math.round( -1.6 ); // -2 Math.round( -1.3 ); // -1 

如果你正在使用angularjs,那么简单的解决scheme如下在HTML模板绑定

{{val | number:0}}

它会将val转换为整数

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

我只想指出,你想要轮回,而不是trunc。 由于一分钱一分钱是不太可能的,因为4.999452 * 100四舍五入会给你5,一个更具代表性的答案。

最重要的是,不要忘记银行家的四舍五入 ,这是一个方法来抵消直接四舍五入的稍微积极的偏见 – 您的财务应用可能需要它。

高斯/银行家在JavaScript中四舍五入