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

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

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

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


console.log(roundNumber(0.1 + 0.2, 2));
console.log(roundNumber(2.1234, 2));

然而,这种方法将四舍五入到 N 小数位的 最大值,而我想要 always四舍五入到 N 小数位。例如,“2.0”将四舍五入为“2”。

Any ideas?

187387 次浏览

这不是舍入问题,这是显示问题。数字不包含有关有效数字的信息,其值2与2.0000000000000相同。当你把四舍五入的值变成一个字符串时,你就可以让它显示一定数量的数字。

你可以在数字后面加上零,比如:

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

(注意,这里假设客户端的区域设置使用周期作为小数点,代码需要更多的工作才能运行其他设置。)

希望可以工作的代码(没有做太多的测试) :

function toFixed(value, precision) {
var precision = precision || 0,
neg = value < 0,
power = Math.pow(10, precision),
value = Math.round(value * power),
integral = String((neg ? Math.ceil : Math.floor)(value / power)),
fraction = String((neg ? -value : value) % power),
padding = new Array(Math.max(precision - fraction.length, 0) + 1).join('0');


return precision ? integral + '.' +  padding + fraction : integral;
}

我找到办法了,这是克里斯托弗的代码:

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”,请阅读使用数组构造函数 给你重复字符的详细信息。

I think that there is a more simple approach to all given here, and is the method Number.toFixed() already implemented in JavaScript.

simply write:

var myNumber = 2;


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

etc...

总有一个更好的方法做事情。使用 精确-

var number = 51.93999999999761;

我想得到四位数的精度: 51.94

就这么做:

number.toPrecision(4);

结果是: 51.94

如果您并不真正关心四舍五入,只需添加一个 tofix (x) ,然后删除尾随的0es 和点(如果需要)。这不是一个快速的解决方案。

function format(value, decimals) {
if (value) {
value = value.toFixed(decimals);
} else {
value = "0";
}
if (value.indexOf(".") < 0) { value += "."; }
var dotIdx = value.indexOf(".");
while (value.length - dotIdx <= decimals) { value += "0"; } // add 0's


return value;
}

类 PHP 舍入法

下面的代码可用于将您自己版本的 Math.round 添加到您自己的名称空间中,该名称空间采用精度参数。与上面示例中的 Decimal 四舍五入不同,它不执行字符串与字符串之间的转换,精度参数的工作方式与 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 ()的参考

我认为下面的功能可以帮助

function roundOff(value,round) {
return (parseInt(value * (10 ** (round + 1))) - parseInt(value * (10 ** round)) * 10) > 4 ? (((parseFloat(parseInt((value + parseFloat(1 / (10 ** round))) * (10 ** round))))) / (10 ** round)) : (parseFloat(parseInt(value * (10 ** round))) / ( 10 ** round));
}

使用方法: roundOff(600.23458,2);将返回 600.23

这种方法可以四舍五入到 N 位(如果你只想截断到 N 位,删除 Math.round 调用并使用 Math.trunc 调用) :

function roundN(value, digits) {
var tenToN = 10 ** digits;
return /*Math.trunc*/(Math.round(value * tenToN)) / tenToN;
}

过去我在编写 数据操作 E-Slate 组件时,不得不在 Java 中使用这种逻辑。这是因为我已经发现,把0.1多次加到0,你会得到一些意想不到的长小数部分(这是由于浮点算术)。

格式数始终显示小数点后2位的用户注释调用这种技术缩放。

有些人提到,有些情况并不像预期的那样四舍五入,http://www.jacklmoore.com/notes/rounding-in-javascript/建议这样做:

function round(value, decimals) {
return Number(Math.round(value+'e'+decimals)+'e-'+decimals);
}
function roundton(num, n) {
return Number(num.toFixed(n));
}

这使用了 JS 的内置方法 Number.prototype.toFixed,它用于格式化字符串,但允许我们四舍五入到一个特定的数字。Number()调用将它干净利落地转换回一个数字对象

理想情况下,我们不需要将它转换为字符串,但是 toFixed是用本机 C + + 编写的,用于执行基本的 cstring 操作可能仍然很快。