如何在 javascript 中用精确的十进制数格式化数字而不四舍五入?
How to format a number with exact of decimal number without rounding in javascript?
假设我有一个号码
const number = 122.333444555666
我想编写一个函数来 return 我想要的精确小数。例如
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;
}
在上面的示例中,我们的小数位数少于所需的比例。因此,我们将根据差异创建一串零以匹配刻度,然后将其附加到十进制字符串的末尾。
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
假设我有一个号码
const number = 122.333444555666
我想编写一个函数来 return 我想要的精确小数。例如
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;
}
在上面的示例中,我们的小数位数少于所需的比例。因此,我们将根据差异创建一串零以匹配刻度,然后将其附加到十进制字符串的末尾。
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