Javascript:将四舍五入的数字格式化为 N 位小数

IT技术 javascript math rounding decimal-point
2021-02-07 14:36:24

在 JavaScript 中,将数字四舍五入到 N 位小数的典型方法是这样的:

function roundNumber(num, dec) {
  return Math.round(num * Math.pow(10, dec)) / Math.pow(10, dec);
}

然而,这种方法将舍入到最多N 个小数位,而我想总是舍入到 N 个小数位。例如,“2.0”将四舍五入为“2”。

有任何想法吗?

6个回答

我认为这里给出的所有方法都有一个更简单的方法,并且该方法Number.toFixed()已经在 J​​avaScript 中实现了。

简单地写:

var myNumber = 2;

myNumber.toFixed(2); //returns "2.00"
myNumber.toFixed(1); //returns "2.0"

等等...

哪里提到了,hoju?我查看了其他答案,但没有发现有人报告说 toFixed 函数有问题。谢谢
2021-03-30 14:36:24
@JordanArseno 这可以使用 parseInt(myNumber.toFixed(intVar)) 修复;返回一个整数值,或 parseFloat(myNumber.toFixed(floatVar)); 如果用户有小数位,则返回浮点数。
2021-04-01 14:36:24
注意:toFixed()返回一个字符串。
2021-04-05 14:36:24
@David:例如,在对答案的评论中提到了这一点。
2021-04-08 14:36:24

我找到了一个方法。这是 Christoph 的修复代码:

function toFixed(value, precision) {
    var precision = precision || 0,
        power = Math.pow(10, precision),
        absValue = Math.abs(Math.round(value * power)),
        result = (value < 0 ? '-' : '') + String(Math.floor(absValue / power));

    if (precision > 0) {
        var fraction = String(absValue % power),
            padding = new Array(Math.max(precision - fraction.length, 0) + 1).join('0');
        result += '.' + padding + fraction;
    }
    return result;
}

如果您对我添加“+ 1”的原因感到好奇,请在此处阅读使用数组构造函数重复字符的详细信息

这种方法有一个错误:toFixed(-0.1111, 2) 返回0.11,即负号丢失。
2021-03-13 14:36:24
以 2 或 3 的精度传入 708.3333333333333 的值会导致我的返回值为 708.00。我需要 2 个小数位,在 Chrome 和 IE 9 中 .toFixed(2) 满足我的需要。
2021-03-14 14:36:24
这不是常见的方式,例如 toFixed(16.775, 2) 返回 16.77。将数字转换为字符串然后转换是唯一的方法。
2021-03-21 14:36:24
效果很好,除了我在最后添加了 parseFloat(result) 。值得编辑。
2021-03-26 14:36:24

这不是四舍五入的问题,而是显示问题。数字不包含有关有效数字的信息;值 2 与 2.0000000000000 相同。当您将四舍五入的值转换为字符串时,您就可以让它显示一定数量的数字。

您可以在数字后添加零,例如:

var s = number.toString();
if (s.indexOf('.') == -1) s += '.';
while (s.length < s.indexOf('.') + 4) s += '0';

(请注意,这里假设客户端的区域设置使用句点作为小数点分隔符,代码需要更多工作才能用于其他设置。)

.toFixed() 在现代浏览器中表现出色(我测试了 Chrome、Firefox、IE11、IE8)。@Bat_Programmer - 请说明您认为哪些浏览器存在该错误。
2021-03-13 14:36:24
toFixed 有问题..例如十进制:1.02449999998 如果你做 dec.toFixed(4) => 1.0244。它应该是 1.0245。
2021-03-17 14:36:24
@deepeshk 在什么浏览器中?刚刚在 Chrome 17 中尝试过并1.02449999998.toFixed(4)正确返回1.0245.
2021-03-23 14:36:24
@deepeshk 但是toFixed(),在四舍五入后,在最后使用小数填充会有什么问题
2021-03-26 14:36:24
@MarkTomlin:那么看来你有一个字符串而不是一个数字。
2021-03-30 14:36:24

总有更好的做事方式。

var number = 51.93999999999761;

我想获得四位数精度:51.94

做就是了:

number.toPrecision(4);

结果将是:51.94

如果加 100 呢?你需要把它改成 number.toPrecision(5) 吗?
2021-03-15 14:36:24
是的。31.939383.toPrecision(4) > "31.94" / 131.939383.toPrecision(4) > "131.9"
2021-03-19 14:36:24

类似 PHP 的舍入方法

下面的代码可用于将您自己的 Math.round 版本添加到您自己的命名空间中,该命名空间采用精度参数。与上面示例中的 Decimal 四舍五入不同,它不执行与字符串的转换,并且 precision 参数的工作方式与 PHP 和 Excel 相同,正 1 将四舍五入到小数点后 1 位,-1 将四舍五入到十位。

var myNamespace = {};
myNamespace.round = function(number, precision) {
    var factor = Math.pow(10, precision);
    var tempNumber = number * factor;
    var roundedTempNumber = Math.round(tempNumber);
    return roundedTempNumber / factor;
};

myNamespace.round(1234.5678, 1); // 1234.6
myNamespace.round(1234.5678, -1); // 1230

来自Mozilla 开发人员参考 Math.round()