gpt4 book ai didi

javascript - 根据大小将数字动态舍入到小数点后 n 位

转载 作者:行者123 更新时间:2023-11-30 18:08:32 28 4
gpt4 key购买 nike

我需要一个函数,它采用计算值(范围可以从非常小到非常大)并将其四舍五入到小数位以供显示。小数位数应该取决于输入的大小,所以我不能只使用像 .toFixed(n) 这样的东西,因为 n 是未知的。

我想出了以下方法,但感觉还有更好的方法:

function format_output(output) {
if (output > 10000) {
output = output.toFixed(0);
} else {
if (output > 100 && output < 10000) {
output = output.toFixed(1);
} else {
if (output>1 && output <100) {
output = output.toFixed(3);
} else {
// repeat as necessary
}
return output;
}

谢谢!

最佳答案

您似乎确实想将其限制在大约五位精度。这可能会更明确地这样做:

var toPrecision = function(precision) {
return function(nbr) {
if (typeof nbr !== 'number') return 0; //???
if (nbr === 0) return 0;
var abs = Math.abs(nbr);
var sign = nbr / abs;
nbr = abs;
var digits = Math.ceil(Math.log(nbr)/Math.LN10);
var factor = Math.pow(10, precision - digits);
var result = nbr * factor;
result = Math.round(result, 0);
return result / factor;
};
};

var format_output = toPrecision(5);

format_output(1234567.89012); // 1234600
format_output(987.654321); // 987.65
format_output(-.00246813579); // -0.0024681

当然,如果您愿意,可以将它们组合成一个双参数函数:

var toPrecision = function(nbr, precision) {
if (typeof nbr !== 'number') return 0; //???
if (nbr === 0) return 0;
var abs = Math.abs(nbr);
var sign = nbr / abs;
nbr = abs;
var digits = Math.ceil(Math.log(nbr)/Math.LN10);
var factor = Math.pow(10, precision - digits);
var result = nbr * factor;
result = Math.round(result, 0);
return result / factor;
};

toPrecision(1234567.89012, 5); // 1234600

或者,如果这能让你的船漂浮起来,你可以将它附加到 Math 对象上:

Math.toPrecision = function(nbr, precision) {
// ...
}

更新(2020 年 5 月)

许多年后,随着 ES6 的普及,我会以不同的方式写这篇文章。它可能看起来像这样:

var toPrecision = (precision) => (nbr, _, __, powerOf10) => 
nbr === 0
? 0
: (
powerOf10 = 10 ** (precision - Math .ceil (Math .log10 (Math .abs (nbr)))),
Math .round (nbr * powerOf10) / powerOf10
)

关于javascript - 根据大小将数字动态舍入到小数点后 n 位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15201784/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com