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

我想在JavaScript中将float转换为整数。 其实,我想知道如何做标准转换:截断和四舍五入。 有效地,不通过转换为字符串和解析。


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

性能比较?

我已经创建了一个JSPerf测试来比较以下性能:

  • Math.floor(val)
  • val | 0 val | 0按位
  • ~~val按位
  • parseInt(val)
  • 只适用于正数。 在这种情况下,您可以安全地使用按位运算以及Math.floor函数。

    但是如果你需要你的代码来处理积极和消极的话 ,那么按位操作是最快的(OR是首选)。 这另一个JSPerf测试比较相同的地方,因为附加的符号检查显然是数学现在是四个中最慢的。

    注意

    正如评论所述,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);
    }
    
    链接地址: http://www.djcxy.com/p/66837.html

    上一篇: How do I convert a float number to a whole number in JavaScript?

    下一篇: convert HTML ( having Javascript ) to PDF using JavaScript