How do I convert a float number to a whole number in JavaScript?
我想用javascript把一个浮点转换成一个整数。实际上,我想知道如何进行两种标准转换:截断和舍入。而且效率很高,不是通过转换成字符串和解析。
1 2 3 4 5 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 ); |
数学对象的参考
实例 积极的
1 2 3 4 5 6 7 8 9 10 11 12 | // 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 |
负
1 2 3 4 5 6 7 8 9 10 11 12 | // 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 |
正larger数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | // 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 |
负larger数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | // 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 |
位或操作符
一位或操作符可以使用浮动点的附加数据和信息工程的positives:AA negatives ]。
1 2 3 | function float2int (value) { return value | 0; } |
结果
1 2 3 4 | 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)
我厂以只读的阳性数。在这个案例,你是安全的使用按位操作功能
但如果你的代码,你需要两个工作positives AA与AA negatives阱,然后一位运算fastest(或是被选择的一个)。本试验将用于其他jsperf一样,它的很明显的,因为额外的检查数学符号是现在的四slowest同行。
注
除非在AA的评论,位在32位操作人员签名integers,因此大数将被转换,例如:
1 2 | 1234567890 | 0 => 1234567890 12345678901 | 0 => -539222987 |
注意:你不能使用
A为正确的附加的替代将是:
1 2 3 4 5 6 7 8 | function truncate(value) { if (value < 0) { return Math.ceil(value); } return Math.floor(value); } |
一双槽位操作符可以使用附加floats。其他上述操作,你是
1 2 3 4 | > ~~2.5 2 > ~~(-1.4) -1 |
更多的细节,courtesy padolsey大学的詹姆斯。
对附加:
1 | var intvalue = Math.floor(value); |
循环:
1 | var intvalue = Math.round(value); |
你可以使用的方法rounding parseint号。小心与用户输入的鸽子的0x(十六进制)和0(八进制)PREFIX选项。
1 | var intValue = parseInt(floatValue, 10); |
位移位市0这是两部城市1当量
1 2 3 | // >> or >>> 2.0 >> 0; // 2 2.0 >>> 0; // 2 |
在你的案例中,当你需要一个字符串的比(为了commas insert),你可以使用"我也number.tofixed()函数,然而,这将rounding perform。
这里有很多的建议。"按位或似乎是simplest市的父亲。这里的冰厂,另一个短的解决方案与负数为好用的模算子。它是不是更容易吗?我们理解:"按位或
1 | intval = floatval - floatval%1; |
这个方法也与高价值的工作,告诉他们|数"0"还是"~"还是"> 0 correctly工作:
1 2 3 4 5 6 7 8 9 | > n=4294967295; > n|0 -1 > ~~n -1 > n>>0 -1 > n-n%1 4294967295 |
一个可能的方式使用异或操作:
1 2 3 4 5 6 7 | 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 |
运算符的优先行动不那么冰优先的数学作业的,是有用的。试试在线jsfiddle.net https:/ / / / au51uj3r
两个附加:
1 2 3 4 | // 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 |
两个循环:
1 2 3 4 | Math.round( 1.5 ); // 2 Math.round( 1.49 ); // 1 Math.round( -1.6 ); // -2 Math.round( -1.3 ); // -1 |
如果看到
basically什么你想做的是简单的和本土意识的JavaScript。
想象你的号码下面的:
1 | const myValue = 56.4534931; |
如果你想要的,现在这两个圆的最下两个号码,只是简单的做:
1 | const rounded = Math.floor(myValue); |
你会得到:
1 | 56 |
如果你想要两个方位的IP网络的近邻数,只是做:
1 | const roundedUp = Math.ceil(myValue); |
你会得到:
1 | 57 |
也正是这两个方位
你也可以使用
你可以使用它像
如果你在使用angularjs那么简单的解决方案,为follows HTML模板固定在
它将convert val的值为整数
去通过链接和这docs.angularjs.org API毫微克/ / / /数字滤波器
我只是想指出,你想monetarily方位,而不是截短。离城有一分钱的冰太多不可能,因为4.999452×100 rounded会给你一个更代表5,答案。
和上顶上,不要忘记我的rounding银行,这是一个方法在两个计数器是卷曲的正向偏置,直rounding给你的应用程序可以要求金融信息。
高斯/银行的rounding在JavaScript