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

时间:2009-02-27 20:15:07

标签: javascript syntax

我想在JavaScript中将float转换为整数。实际上,我想知道如何同时执行标准转换:截断和舍入。并且有效,而不是通过转换为字符串和解析。

16 个答案:

答案 0 :(得分:1364)

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 object reference


实施例

<强>正
// 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
// 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
正面 - 数字较大
// 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
否定 - 数字较大
// 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

答案 1 :(得分:282)

按位OR运算符

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

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

结果

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

性能比较?

我创建了一个JSPerf test来比较以下各项之间的效果:

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

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

但是如果你需要你的代码使用正面和负面,那么按位操作是最快的(OR是首选的)。 This other JSPerf test比较相同的情况,因为额外的符号检查数学现在是四个中最慢的

注意

如评论中所述,BITWISE运算符使用带符号的32位整数运算,因此将转换大数字,例如:

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

答案 2 :(得分:91)

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

truncate的正确替换是:

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

    return Math.floor(value);
}

答案 3 :(得分:42)

可以使用双bitwise not运算符截断浮点数。您提到的其他操作可通过Math.floorMath.ceilMath.round获得。

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

More details courtesy of James Padolsey.

答案 4 :(得分:38)

截断:

var intvalue = Math.floor(value);

对于回合:

var intvalue = Math.round(value);

答案 5 :(得分:22)

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

var intValue = parseInt(floatValue, 10);

答案 6 :(得分:17)

位移0,相当于除以1

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

答案 7 :(得分:8)

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

答案 8 :(得分:6)

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

intval = floatval - floatval%1;

此方法也适用于高值数字,其中“| 0”,“~~”和“&gt;&gt; 0”都不能正常工作:

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

答案 9 :(得分:5)

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

按位运算的优先级低于数学运算的优先级,它很有用。试试https://jsfiddle.net/au51uj3r/

答案 10 :(得分:4)

//Convert a float to integer

Math.floor(5.95)
//5

Math.ceil(5.95)
//6

Math.round(5.4)
//5

Math.round(5.5)
//6

Math.trunc(5.5)
//5

//Quick Ways
console.log(5.95| 0)
console.log(~~5.95) 
console.log(5.95 >> 0)
//5

答案 11 :(得分:2)

性能

今天2020.11.28我针对选定的解决方案在Chrome v85,Safari v13.1.2和Firefox v80的MacOs HighSierra 10.13.6上进行测试。

结果

  • 对于所有浏览器,所有解决方案(B和K除外)都给出非常相似的速度结果
  • 解决方案B和K慢

enter image description here

详细信息

我执行了可以运行HERE的测试用例

以下代码段显示了解决方案之间的差异 A B C D E F G H I J K L

||
Status Patrol()
    => (playerInSight && Shoot(player)) 
    || (underFire && TakeCover())
    || GuardDoorway();

这是铬的示例结果

enter image description here

答案 12 :(得分:1)

截断

// 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

答案 13 :(得分:1)

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

基本上,您想要做的是非常简单的JavaScript本机...

想象一下您的电话号码如下:

const myValue = 56.4534931;

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

const rounded = Math.floor(myValue);

您会得到:

56

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

const roundedUp = Math.ceil(myValue);

您会得到:

57

Math.round将其四舍五入到较高或较低的数字取决于哪个更接近浮点数。

您还可以在浮点数后面使用~~,将浮点数转换为整数。

您可以像~~myValue ...

那样使用它

答案 14 :(得分:0)

我只想指出,你想要圆润,而不是截断。因为4.999452 * 100四舍五入会给你5分,更有代表性的答案,因此被一分钱贬值的可能性要小得多。

最重要的是,不要忘记banker's rounding,这是一种抵消直接舍入所带来的略微积极偏见的方法 - 您的财务应用可能需要它。

Gaussian/banker's rounding in JavaScript

答案 15 :(得分:0)

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

{{val | number:0}}

它会将val转换为整数

使用此链接docs.angularjs.org/api/ng/filter/number