2

我需要一个函数,它接受一个计算值(范围可以从非常小到非常大)并将其四舍五入到小数位以供显示。小数位数应该取决于输入的大小,所以我不能只使用像.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;
}

谢谢!

4

4 回答 4

4

您似乎确实希望将其限制为大约五个精度位置。这可能会更明确地这样做:

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
      )
于 2013-03-04T13:20:02.877 回答
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;
}
于 2013-03-04T12:46:07.687 回答
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); 
  ">
于 2013-03-04T12:59:54.637 回答
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);

通过这种方式,它可以为您提供看起来合理的小数字,并从大数字中删除小数。它并不完美,但在我能想到/找到更好的解决方案之前它现在运行良好。

于 2016-08-08T16:51:52.990 回答