动态舍入数字到n个小数位,具体取决于幅度

时间:2013-03-04 12:37:46

标签: javascript

我需要一个函数,它取一个计算值(范围从非常小到非常大)并将其四舍五入到显示的小数位数。小数位数应取决于输入的大小,因此我不能只使用.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 个答案:

答案 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);

这样它可以为您提供看似合理的小数字,并从大数字中修剪小数。它并不完美,但它现在运作良好,直到我能想到/找到更好的解决方案。