我需要一个函数,它取一个计算值(范围从非常小到非常大)并将其四舍五入到显示的小数位数。小数位数应取决于输入的大小,因此我不能只使用.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;
}
谢谢!
答案 0 :(得分:1)
根据您的要求,您应该研究科学记数法
output.toExponential();
如果您不想使用科学记数法,请尝试以下方法:
function format_output(output) {
var n = Math.log(output) / Math.LN10;
var x = 4-n;
if(x<0)
x=0;
output = output.toFixed(x);
return output;
}
答案 1 :(得分:1)
似乎你想要将其限制在大约五个精度位置。这可能会更明确地这样做:
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) {
// ...
}
答案 2 :(得分:0)
似乎您希望将值限制为5位有效数字。以下是针对有限范围的值(99999至0.00001),您可以了解如何为其余值执行此操作。请注意,对于某些值,某些旧版浏览器可能存在舍入错误。
<input onchange="
var bits = this.value.split('.');
var places = 5 - bits[0].length;
if (places < 0) {
places = 0;
} else if (bits[0] == 0) {
places = 5;
}
this.value = Number(this.value).toFixed(places);
">
答案 3 :(得分:0)
这是我在尝试解决相同问题时提出的方法,如何动态舍入以向最终用户呈现非常大和非常小的数字。
function get_exponent_value(num){
value = num.toExponential();
string_e_value = value.split('e')[1];
return parseInt(string_e_value);
}
这为您提供给定数字的指数值。然后,要使用它,您可以根据这个数字进行舍入:
var EValue = get_exponent_value(val);
if (EValue <= -1)
val = float_to_fixed(val, ((EValue * -1) + 3));
else
val = float_to_fixed(val);
这样它可以为您提供看似合理的小数字,并从大数字中修剪小数。它并不完美,但它现在运作良好,直到我能想到/找到更好的解决方案。