javascript - number - js轉小數




如何在JavaScript中將浮點數轉換為整數? (9)

按位或運算符

一個按位或運算符可以用來截斷浮點數字,它可以用於正數和負數:

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

我想在JavaScript中將float轉換為整數。 其實,我想知道如何做標準轉換:截斷和四捨五入。 有效地,不通過轉換為字符串和解析。


移位0,相當於除以1

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

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



如果您使用的是angularjs,那麼簡單的解決方案如下:在HTML Template Binding中

{{val | number:0}}

它會將val轉換為整數

通過這個鏈接docs.angularjs.org/api/ng/filter/number


對於截斷:

var intvalue = Math.floor(value);

對於一輪:

var intvalue = Math.round(value);

我只想指出,你想要輪迴,而不是trunc。 由於一分錢一分錢是不太可能的,因為4.999452 * 100四捨五入會給你5,一個更具代表性的答案。

最重要的是,不要忘記銀行家的四捨五入 ,這是一種抵消直接四捨五入的輕微積極偏見的方式 - 您的財務應用可能需要它。

高斯/銀行家在JavaScript中四捨五入


注意:您不能使用Math.floor()作為截斷的替代,因為Math.floor(-3.1) = -4而不是-3

截斷的正確替代將是:

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

    return Math.floor(value);
}

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






syntax