代码之家  ›  专栏  ›  技术社区  ›  mcherm

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

  •  929
  • mcherm  · 技术社区  · 15 年前

    14 回复  |  直到 8 年前
        1
  •  1926
  •   Zsolt Meszaros    4 年前
    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
    
        2
  •  323
  •   Nick.T    8 年前

    按位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 按位
    • ~~val 按位
    • parseInt(val)

    这只适用于正数。在这种情况下,也可以安全地使用位操作 Math.floor 作用

    既要处理积极的一面,也要处理消极的一面 This other JSPerf test 比较相同的地方,因为额外的符号检查 数学现在是最慢的

    笔记

    如注释中所述,按位运算符对有符号32位整数进行运算,因此将转换大数,例如:

    1234567890  | 0 => 1234567890
    12345678901 | 0 => -539222987
    
        3
  •  98
  •   Jackson Ray Hamilton    9 年前

    Math.floor() 作为truncate的替代,因为 Math.floor(-3.1) = -4 -3 !!

    function truncate(value)
    {
        if (value < 0) {
            return Math.ceil(value);
        }
    
        return Math.floor(value);
    }
    
        4
  •  48
  •   brad    13 年前
        5
  •  42
  •   JP Silvashy Gautam Rege    13 年前

    对于截断:

    var intvalue = Math.floor(value);
    

    第二轮:

    var intvalue = Math.round(value);
    
        6
  •  29
  •   Graeme Wicksted    3 年前

    你可以使用 parseInt 不舍入的方法。由于0x(十六进制)和0(八进制)前缀选项,请小心用户输入。

    var intValue = parseInt(floatValue, 10);
    

    警告 (从注释部分),请注意某些数值将转换为指数形式,例如 1e21 这会导致不正确的十进制表示 "1"

        7
  •  19
  •   Peter Mortensen Pieter Jan Bonestroo    8 年前

    // >> or >>>
    2.0 >> 0; // 2
    2.0 >>> 0; // 2
    
        8
  •  14
  •   Boris Verkhovskiy Brian Clapper    5 年前

    在您的情况下,当您希望在末尾插入字符串(以便插入逗号)时,也可以使用 Number.toFixed()

        9
  •  7
  •   Juliane Holzt    11 年前

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

    intval = floatval - floatval%1;
    

    此方法也适用于既不为“|0”也不为“~~'或”>&燃气轮机;“0”正常工作:

    > n=4294967295;
    > n|0
    -1
    > ~~n
    -1
    > n>>0
    -1
    > n-n%1
    4294967295
    
        10
  •  7
  •   Ran Marciano    3 年前

    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/

        11
  •  6
  •   pk_code    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
        12
  •  6
  •   Ran Marciano    3 年前

    截断 :

    // Math.trunc() is part of the ES6 spec
    console.log(Math.trunc( 1.5 ));  // returns 1
    console.log(Math.trunc( -1.5 )); // returns -1
    // Math.floor( -1.5 ) would return -2, which is probably not what you wanted

    圆形的 :

    console.log(Math.round( 1.5 ));  // 2
    console.log(Math.round( 1.49 )); // 1
    console.log(Math.round( -1.6 )); // -2
    console.log(Math.round( -1.3 )); // -1
        13
  •  3
  •   Alireza    5 年前

    Math

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

    const myValue = 56.4534931;
    

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

    const rounded = Math.floor(myValue);
    

    你会得到:

    56
    

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

    const roundedUp = Math.ceil(myValue);
    

    你会得到:

    57
    

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

    你也可以使用 ~~

    你可以像这样使用它 ~~myValue ...

        14
  •  3
  •   Kamil Kiełczewski    4 年前

    表演

    今天是2020年11月28日,我在MacOs HighSierra 10.13.6上为选定的解决方案在Chrome v85、Safari v13.1.2和Firefox v80上进行测试。

    后果

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

    enter image description here

    细节

    HERE

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

    function A(float) {
        return Math.trunc( float );
    }
    
    function B(float) {
        return parseInt(float);
    }
    
    function C(float) {
        return float | 0;
    }
    
    function D(float) {
        return ~~float;
    }
    
    function E(float) {
        return float >> 0;
    }
    
    function F(float) {
        return float - float%1;
    }
    
    function G(float) {
        return float ^ 0;
    }
    
    function H(float) {
        return Math.floor( float );
    }
    
    function I(float) {
        return Math.ceil( float );
    }
    
    function J(float) {
        return Math.round( float );
    }
    
    function K(float) {
        return float.toFixed(0);
    }
    
    function L(float) {
        return float >>> 0;
    }
    
    
    
    
    
    
    // ---------
    // TEST
    // ---------
    
    [A,B,C,D,E,F,G,H,I,J,K,L]
      .forEach(f=> console.log(`${f.name} ${f(1.5)} ${f(-1.5)} ${f(2.499)} ${f(-2.499)}`))
    This snippet only presents functions used in performance tests - it not perform tests itself!

    enter image description here

        15
  •  1
  •   Community Keith    7 年前

    我只想指出,从金钱上来说,你想要的是回合,而不是特鲁克。因为4.999452*100四舍五入会给你5分,这是一个更具代表性的答案。

    除此之外,别忘了 banker's rounding ,这是一种抵消直接取整所带来的轻微正面偏差的方法——您的财务应用程序可能需要它。

    Gaussian/banker's rounding in JavaScript

        16
  •  0
  •   Jameel Grand    8 年前


    {{val | number:0}}

    它将val转换为整数

    完成此链接 docs.angularjs.org/api/ng/filter/number