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

标签 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;
}

谢谢!

最佳答案

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

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/

相关文章:

javascript - 如何在全局和 requireJS 对象内部调度事件?

javascript - 多个数组对象操作

javascript - JSON 输入意外结束 showNeg.js

javascript - 使用JavaScript中两个1D数组的成对元素创建2D数组

javascript - promise 不返回任何数据以获取返回

javascript - Facebook 如何控制#!在网址中

javascript - 我没有构建的系统中的 JSON 解析错误

javascript - 图片路径问题

javascript - 如何将 .createElement ("image") 也制作成链接

javascript - 表单转换为错误的 json 格式