Javascript:将四舍五入的数字格式化为N小数
在JavaScript中,将数字四舍五入为小数点后N位的典型方式如下所示:
function round_number(num, dec) { return Math.round(num * Math.pow(10, dec)) / Math.pow(10, dec); }
然而,这种方法将四舍五入到最多 N个小数位,而我总是四舍五入到N个小数位。 例如“2.0”会被舍入为“2”。
有任何想法吗?
这不是一个圆形的问题,这是一个显示问题。 一个数字不包含有效数字的信息; 值2与2.0000000000000相同。 当你把四舍五入的值变成一个string时,你将显示一定数量的数字。
你可以在数字后加零,如下所示:
var s = number.toString(); if (s.indexOf('.') == -1) s += '.'; while (s.length < s.indexOf('.') + 4) s += '0';
(请注意,这假定客户端的区域设置使用句号作为小数点分隔符,代码需要更多工作才能用于其他设置。)
我认为这里有一个更简单的方法,并且已经在JavaScript中实现了Number.toFixed()
方法。
简单地写:
var myNumber = 2; myNumber.toFixed(2); //returns "2.00" myNumber.toFixed(1); //returns "2.0"
等等…
我find了一个方法。 这是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”,请阅读使用数组构造函数重复字符的详细信息。
总是有更好的办法。
var number = 51.93999999999761;
我想获得四位数的精度:51.94
做就是了:
number.toPrecision(4);
结果将是:51.94
类似于PHP的舍入方法
下面的代码可以用来将你自己的Math.round版本添加到你自己的命名空间中,它需要一个精度参数。 与上述示例中的小数舍入不同,这不会执行与string之间的转换,精度参数与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()
希望工作的代码(没有做太多的testing):
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; }
这是一个JavaScript sprintf的链接,
http://www.webtoolkit.info/javascript-sprintf.html
对sprintf()的调用是perl中的一种舍入方法,但是javascript本身不具有该函数。
http://perldoc.perl.org/functions/sprintf.html
这有帮助吗?
我觉得下面的function可以帮助
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
如果你不关心舍入,只需要添加一个toFixed(x),然后删除尾部0和点(如果有必要的话)。 这不是一个快速的解决scheme。
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; }