假設我有一個號碼
const number = 122.333444555666
我想寫一個函式來回傳我想要的確切的十進制數。例如
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,但它總是聚集起來。任何的想法?
uj5u.com熱心網友回復:
使用浮點數時,我喜歡在小數位處拆分并將兩邊都視為整數。它使對它們的操作更容易一些,并提高了準確性。
const [wholeNumber, decimals] = num.split(".");
將小數分隔為字串使我們能夠快速將其與所需的比例進行比較,從而使我們能夠確定是加還是減。
if (decimals.length < scale) {
const diff = scale - decimals.length;
const trailingZeros = new Array(diff).fill(0).join("");
decimals = trailingZeros;
}
在上面的示例中,我們的小數位數少于所需的比例。因此,我們將根據差異創建一串零以匹配比例,然后將其附加到十進制字串的末尾。
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(".")
}
const number = 122.333444555666;
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
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/405402.html
標籤:
