Answers:
这不是一个四舍五入的问题,而是一个显示问题。数字不包含有关有效数字的信息。值2与2.0000000000000相同。当您将舍入后的值转换为字符串时,已使其显示一定数量的数字。
您可以在数字后添加零,例如:
var s = number.toString();
if (s.indexOf('.') == -1) s += '.';
while (s.length < s.indexOf('.') + 4) s += '0';
(请注意,这是假设客户端的区域设置使用句点作为小数点分隔符,该代码需要更多工作才能用于其他设置。)
toFixed()
在四舍五入后使用小数点末尾填充会有什么问题?
1.02449999998.toFixed(4)
正确返回1.0245
。
我认为这里提供了一种更简单的方法,并且该方法Number.toFixed()
已经在JavaScript中实现。
只需写:
var myNumber = 2;
myNumber.toFixed(2); //returns "2.00"
myNumber.toFixed(1); //returns "2.0"
等等...
toFixed()
返回一个字符串。
我找到了一个方法。这是克里斯托夫的代码,带有修复程序:
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”感到好奇,请在此处阅读使用数组构造函数重复字符的详细信息。
总有一种更好的做事方式。
var number = 51.93999999999761;
我想得到四位数的精度:51.94
做就是了:
number.toPrecision(4);
其结果将是:51.94
下面的代码可用于将您自己的Math.round版本添加到带有精度参数的名称空间中。与上述示例中的十进制舍入不同,它不执行字符串间的转换,而precision参数的工作方式与PHP和Excel相同,其中,正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
希望能工作的代码(没有做太多的测试):
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 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多次加0.1会得到一些意想不到的长小数部分(这是由于浮点运算所致)。
用户在格式编号处始终显示2个小数位的注释称为此技术缩放。
有人提到有些情况无法按预期进行,在http://www.jacklmoore.com/notes/rounding-in-javascript/中建议使用以下方法:
function round(value, decimals) {
return Number(Math.round(value+'e'+decimals)+'e-'+decimals);
}
如果您不太在意舍入,只需添加toFixed(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;
}
format(1.2, 5)
了1.2
但得到了期望1.20000
。
toFixed()
(developer.mozilla.org/En/Core_JavaScript_1.5_Reference/…),但这在IE中是有问题的:stackoverflow.com/questions/661562/…;您必须编写自己的版本...