关于语法:如何在javascript中将浮点数转换为整数?

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)

我厂以只读的阳性数。在这个案例,你是安全的使用按位操作功能Math.floor抵抗。

但如果你的代码,你需要两个工作positives AA与AA negatives阱,然后一位运算fastest(或是被选择的一个)。本试验将用于其他jsperf一样,它的很明显的,因为额外的检查数学符号是现在的四slowest同行。

除非在AA的评论,位在32位操作人员签名integers,因此大数将被转换,例如:

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


注意:你不能使用Math.floor()为作为一个附加的替代,而不是因为Math.floor(-3.1) = -4-3!!!!!!!!

A为正确的附加的替代将是:

1
2
3
4
5
6
7
8
function truncate(value)
{
    if (value < 0) {
        return Math.ceil(value);
    }

    return Math.floor(value);
}


一双槽位操作符可以使用附加floats。其他上述操作,你是Math.floor可通,Math.ceilMath.round鸭。

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


如果看到MathJavaScript对象的人,你会得到整个Bunch of函数两个工作片数和价值观等。

basically什么你想做的是简单的和本土意识的JavaScript。

想象你的号码下面的:

1
const myValue = 56.4534931;

如果你想要的,现在这两个圆的最下两个号码,只是简单的做:

1
const rounded = Math.floor(myValue);

你会得到:

1
56

如果你想要两个方位的IP网络的近邻数,只是做:

1
const roundedUp = Math.ceil(myValue);

你会得到:

1
57

也正是这两个方位Math.round高或低数取决于这一片冰接近两个好的号码。

你也可以使用~~后面的号码,将浮子,浮子convert A两个整数。

你可以使用它像~~myValue


如果你在使用angularjs那么简单的解决方案,为follows HTML模板固定在

{{val | number:0}}

它将convert val的值为整数

去通过链接和这docs.angularjs.org API毫微克/ / / /数字滤波器


我只是想指出,你想monetarily方位,而不是截短。离城有一分钱的冰太多不可能,因为4.999452×100 rounded会给你一个更代表5,答案。

和上顶上,不要忘记我的rounding银行,这是一个方法在两个计数器是卷曲的正向偏置,直rounding给你的应用程序可以要求金融信息。

高斯/银行的rounding在JavaScript