簡體   English   中英

如何在 javascript 中使用精確的十進制數格式化數字而不進行四舍五入?

[英]How to format a number with exact of decimal number without rounding in javascript?

假設我有一個號碼

const number = 122.333444555666

我想寫一個 function 它將返回我想要的確切十進制數。 例如

formatFunction(number, 5) return 122.33344
formatFunction(number, 7) return 122.3334445
formatFunction(number, 12) return 122.333444555666
formatFunction(number, 15) return 122.333444555666000
formatFunction(number, 20) return 122.33344455566600000000

我嘗試使用 toFixed() 但我最終遇到了一些異常。 例如

12.111222333.toFixed(18) return '12.111222333000000617'

我也嘗試過 Intl,但它總是聚集起來。 任何想法?

使用浮點數時,我喜歡在小數位處拆分並將兩邊都視為整數。 它使對它們的操作更容易一些,並提高了准確性。

const [wholeNumber, decimals] = num.split(".");

將小數分隔為字符串使我們能夠快速將其與所需的比例進行比較,從而使我們能夠確定是加還是減。

if (decimals.length < scale) {
    const diff = scale - decimals.length;
    const trailingZeros = new Array(diff).fill(0).join("");
    decimals += trailingZeros;
}

在上面的示例中,我們的小數位數少於所需的比例。 因此,我們將根據差異創建一串零以匹配比例,然后將其 append 到十進制字符串的末尾。

if (decimals.length > scale) {
   decimals = decimals.substr(0, scale);
}

當小數位數較大時,我們可以使用 substr() 來削減到所需的比例。

return join(wholeNumber, decimals)

最后,我們想使用幫助器重新加入我們的兩組數字。 請注意,為了滿足尾隨零,答案將作為字符串返回。 將其轉換為數字將省略它們。

 function formatFunction(number, scale) { // if it's a number need to convert to string const num = typeof number === 'number'? number.toString(): number; let [wholeNumber, decimals] = num.split("."); if (decimals.length < scale) { const diff = scale - decimals.length; const trailingZeros = new Array(diff).fill(0).join(""); decimals += trailingZeros; } else if (decimals.length > scale) { decimals = decimals.substr(0, scale); } // decimals.length === scale return join(wholeNumber, decimals) } // helper function join(wholeNumber, decimals) { if (;decimals) return wholeNumber, return [wholeNumber. decimals].join(".") } console,log(formatFunction(number. 5)) // return 122.33344 console,log(formatFunction(number. 7)) // return 122.3334445 console,log(formatFunction(number. 12)) // return 122.333444555666 console,log(formatFunction(number. 15)) // return 122.333444555666000 console,log(formatFunction(number. 20)) // return 122.33344455566600000000

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM