hoj*_*oju 100 javascript math decimal-point rounding
在JavaScript中,将数字舍入到N个小数位的典型方法是:
function roundNumber(num, dec) {
return Math.round(num * Math.pow(10, dec)) / Math.pow(10, dec);
}
Run Code Online (Sandbox Code Playgroud)
然而,这种方法将舍入到最多 N个小数位,而我想要总是舍入到N个小数位.例如,"2.0"将四舍五入为"2".
有任何想法吗?
Dav*_*vid 230
我认为这里给出了一个更简单的方法,并且Number.toFixed()
已经在JavaScript中实现了该方法.
简单地写:
var myNumber = 2;
myNumber.toFixed(2); //returns "2.00"
myNumber.toFixed(1); //returns "2.0"
Run Code Online (Sandbox Code Playgroud)
等等...
Eli*_*ria 50
我找到了一个方法.这是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;
}
Run Code Online (Sandbox Code Playgroud)
阅读重复使用数组构造一个字符的细节在这里,如果你是好奇,为什么我添加了"+ 1".
Guf*_*ffa 23
这不是一个四舍五入的问题,这是一个显示问题.数字不包含有效数字的信息; 值2与2.0000000000000相同.当您将舍入值转换为字符串时,它会使其显示一定数量的数字.
您可以在数字后添加零,例如:
var s = number.toString();
if (s.indexOf('.') == -1) s += '.';
while (s.length < s.indexOf('.') + 4) s += '0';
Run Code Online (Sandbox Code Playgroud)
(请注意,这假设客户端的区域设置使用句点作为小数分隔符,代码需要更多工作才能用于其他设置.)
de.*_*.ru 15
总有一种更好的做事方式.
var number = 51.93999999999761;
Run Code Online (Sandbox Code Playgroud)
我想得到四位数的精度:51.94
做就是了:
number.toPrecision(4);
Run Code Online (Sandbox Code Playgroud)
结果将是:51.94
这适用于四舍五入到 N 位(如果您只想截断到 N 位,请删除 Math.round 调用并使用 Math.trunc ):
function roundN(value, digits) {
var tenToN = 10 ** digits;
return /*Math.trunc*/(Math.round(value * tenToN)) / tenToN;
}
Run Code Online (Sandbox Code Playgroud)
过去,当我编写数据操作 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);
}
Run Code Online (Sandbox Code Playgroud)
function roundton(num, n) {
return Number(num.toFixed(n));
}
Run Code Online (Sandbox Code Playgroud)
这使用了 JS 的内置方法,Number.prototype.toFixed
该方法用于格式化字符串,但允许我们四舍五入到特定的位数。调用Number()
将其干净地转换回数字对象
理想情况下,我们不需要将其转换为字符串,但toFixed
它是用本机 C++ 编写的,执行基本的 cstring 操作,因此它可能仍然很快。
下面的代码可用于将您自己的Math.round版本添加到您自己的命名空间,该命名空间采用精度参数.与上面示例中的十进制舍入不同,它不执行与字符串的转换,并且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
Run Code Online (Sandbox Code Playgroud)