JavaScript:格式化一个圆形数字为N小数
-
19-09-2019 - |
题
在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));
但是,这种方法将为 最大 我想 总是 圆形到十进制位置。例如,“ 2.0”将四舍五入为“ 2”。
有任何想法吗?
解决方案
这不是一个圆形拼图,这是一个显示问题。一个数字不包含有关重要数字的信息;值2与2.0000000000000相同。当您将圆形值变成字符串时,您已经使其显示一定数量的数字。
您可以在数字之后添加零,例如:
var s = number.toString();
if (s.indexOf('.') == -1) s += '.';
while (s.length < s.indexOf('.') + 4) s += '0';
(请注意,这假定客户端的区域设置使用时期作为小数分离器,该代码需要更多的工作来为其他设置起作用。)
其他提示
我认为这里给出了一种更简单的方法,这是方法 Number.toFixed()
已经在JavaScript中实现。
只需写:
var myNumber = 2;
myNumber.toFixed(2); //returns "2.00"
myNumber.toFixed(1); //returns "2.0"
ETC...
我找到了一个方法。这是克里斯托夫的守则,有一个解决方案:
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
类似PHP的圆形方法
下面的代码可用于将您自己的Math.Math.ROUND添加到您自己的名称空间中,该命名空间采用精度参数。与上面的示例中的小数圆形不同,它不执行与字符串的转换,并且精度参数的工作方式与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
希望工作代码(没有进行太多测试):
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;
}
这适用于舍入到n位数字(如果您只想截断到n位数字删除数学。调用并使用Math.trunc One):
function roundN(value, digits) {
var tenToN = 10 ** digits;
return /*Math.trunc*/(Math.round(value * tenToN)) / tenToN;
}
过去,我在撰写时不得不在Java求助于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);
}
这是指向JavaScript Sprintf的链接,
http://www.webtoolkit.info/javascript-sprintf.html
呼叫Sprintf()是Perl中的一种圆形方法,但是JavaScript在本地没有该功能。
http://perldoc.perl.org/functions/sprintf.html
这有帮助吗?
我认为以下功能可以帮助
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
如果您不太在乎舍入,只需添加一个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;
}