当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何在JavaScript中将浮点数转换为整数?》经验,为你挑选了10个好方法。

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



1> moonshadow..:
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 );

数学对象参考


例子

// value=x        //  x=5          5> 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


正如另一个答案所提到的,可以使用`var intValue = ~~flovValue;`来完成负安全截断.如果符号过于模糊,只需将其隐藏在函数中:`function toInt(value){return ~~ value; }`.(如果您愿意,也可以将字符串转换为整数.)
关于注释~~将值限制为32位有符号整数,而Math.floor/ceil/round最多可以处理53位(Number.MAX_SAFE_INTEGER 9007199254740991).这在下面的答案中提到,但是对于那些阅读这些评论的人来说,值得重复.
如果这个答案有示例输入/输出,则会upvote.
在几个地方从下面阅读:`Math.trunc(val);`注释,因为这是接受的答案

2> Robert Korit..:

按位OR运算符

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

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

结果

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

性能比较?

我创建了一个JSPerf测试,用于比较以下各项之间的性能:

Math.floor(val)

val | 0 按位OR

~~val 按位NOT

parseInt(val)

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

但是,如果您需要使用代码来处理正数和负数,那么按位运算是最快的(OR是首选运算).这个其他JSPerf测试比较相同的地方很明显,因为额外的符号检查Math现在是四个中最慢的.

注意

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

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


@thefourtheye:除了无符号右移之外的所有按位运算,对有符号的32位整数起作用.因此,对浮点值使用按位运算会将它们转换为小数点后的数字剥离数字.
请注意,按位运算符以32位数运算.它们不适用于太大而不适合32位的数字.
如果您只需要正数,则`Math.floor()`会更快(至少根据我的第一个[JSPerf测试]运行情况(http://jsperf.com/float-to-int-conversion-comparison) )(在Google Chrome版本30.0.1599.101上)更健壮(因为它不依赖于数字以位表示的方式,这可能会更改并可能破坏此按位解决方案),而且最重要的是,要更加明确。
`~~`更好,因为它是一元运算符。`4.2 | 0 + 4`等于`4`但`~~ 4.2 + 4`等于`8`

3> 小智..:

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

截断的正确替换将是:

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

    return Math.floor(value);
}


@mcherm:然后他们似乎没有正确地理解术语"截断".截断正如其名称所暗示的那样:它截断数字.从来没有(在一般意义上)相当于地板或天花板.http://en.wikipedia.org/wiki/Truncation
在ECMAScript 6中添加了`Math.trunc(value)`
`floor`向-infinity方向转,`truncate`向零方向转.(`ceil`向+无穷大方向转).

4> brad..:

双位按运算符可用于截断浮点数.你提到的其他操作都可以通过Math.floor,Math.ceilMath.round.

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

更多细节由James Padolsey提供.


请注意,任一方法(~~ n或n | 0)仅适用于最多2 ^ 31-1或2147483647的数字.2147483648或更高版本将返回不正确的结果; 例如,2147483647 | 0返回-2147483648,而4294967295 | 0返回-1,这几乎绝对不是您想要的.
这也可以用n |来完成 0.

5> Mike..:

对于截断:

var intvalue = Math.floor(value);

圆形:

var intvalue = Math.round(value);


Math.floor不会截断负值.见上面的答案.否则很好的答案.

6> Graeme Wicks..:

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

var intValue = parseInt(floatValue, 10);


@ Qantas94Heavy造成这种行为的原因是因为[`parseInt()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/parseInt)需要*string*not一个数字作为其第一个参数.当你传递这个整数时,它被转换为`1e21`然后`parseInt`解析字符串`1e21`,结果是'1`.
虽然这是旧的,但这个问题似乎经常被问到,所以我会把这个作为警告.如果由于其大小而使用"e"符号表示该值,则它将仅产生一个数字,而不是预期的数字.例如,`parseInt函数(1000000000000000000000,10);`结果1,而不是1 000 000 000 000 000 000 000总之,问题明确不希望"_converting为字符串,并parsing_",尽管这是相对次要的...... ;)
始终将第二个值传递给parseInt,以指定所需的基数。因此,parseInt(floatValue,10)总是以10为底。

7> Prasanth..:

位移0,相当于除以1

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


小注:`>> 0`似乎只适用于整数<_2 ^ 31-1_,而`>>> 0`适用于整数<_2 ^ 32-1_.对于较大的值,返回0

8> Russell Legg..:

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



9> Juliane Holz..:

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

intval = floatval - floatval%1;

此方法也适用于高值数字,其中"| 0","~~"和">> 0"都不能正常工作:

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



10> Dmitry Khari..:

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

推荐阅读
围脖上的博博_771
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有