在 JavaScript 中,将数字四舍五入到 N 位小数的典型方法是这样的:
function roundNumber(num, dec) {
return Math.round(num * Math.pow(10, dec)) / Math.pow(10, dec);
}
然而,这种方法将舍入到最多N 个小数位,而我想总是舍入到 N 个小数位。例如,“2.0”将四舍五入为“2”。
有任何想法吗?
在 JavaScript 中,将数字四舍五入到 N 位小数的典型方法是这样的:
function roundNumber(num, dec) {
return Math.round(num * Math.pow(10, dec)) / Math.pow(10, dec);
}
然而,这种方法将舍入到最多N 个小数位,而我想总是舍入到 N 个小数位。例如,“2.0”将四舍五入为“2”。
有任何想法吗?
我认为这里给出的所有方法都有一个更简单的方法,并且该方法Number.toFixed()
已经在 JavaScript 中实现了。
简单地写:
var myNumber = 2;
myNumber.toFixed(2); //returns "2.00"
myNumber.toFixed(1); //returns "2.0"
等等...
我找到了一个方法。这是 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”的原因感到好奇,请在此处阅读使用数组构造函数重复字符的详细信息。
这不是四舍五入的问题,而是显示问题。数字不包含有关有效数字的信息;值 2 与 2.0000000000000 相同。当您将四舍五入的值转换为字符串时,您就可以让它显示一定数量的数字。
您可以在数字后添加零,例如:
var s = number.toString();
if (s.indexOf('.') == -1) s += '.';
while (s.length < s.indexOf('.') + 4) s += '0';
(请注意,这里假设客户端的区域设置使用句点作为小数点分隔符,代码需要更多工作才能用于其他设置。)
总有更好的做事方式。
var number = 51.93999999999761;
我想获得四位数精度:51.94
做就是了:
number.toPrecision(4);
结果将是:51.94
下面的代码可用于将您自己的 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