如何在JavaScript中格式化一个浮点数?
在JavaScript中,当从float转换为string时,如何在小数点之后得到2位数字? 例如,0.34而不是0.3445434。
var result = Math.round(original*100)/100;
具体情况,以防代码不言自明。
编辑:…或者只是使用toFixed
,正如TimBüthe所build议的那样 。 忘了那一个,谢谢(和upvote)提醒:)
有function来整数。 例如:
var x = 5.0364342423; print(x.toFixed(2));
将打印5.04。
编辑: 小提琴
使用toFixed()
时要小心:
首先,使用数字的二进制表示将数字四舍五入,这可能会导致意外的行为。 例如
(0.595).toFixed(2) === '0.59'
而不是'0.6'
。
其次, toFixed()
有一个IE错误。 在IE中(至less到版本7,没有检查IE8),以下情况是正确的:
(0.9).toFixed(0) === '0'
遵循kkyy的build议或使用自定义toFixed()
函数可能是个好主意,例如
function toFixed(value, precision) { var power = Math.pow(10, precision || 0); return String(Math.round(value * power) / power); }
还有一个问题需要注意的是toFixed()
会在数字的末尾产生不必要的零。 例如:
var x=(23-7.37) x 15.629999999999999 x.toFixed(6) "15.630000"
这个想法是使用RegExp
清理输出:
function humanize(x){ return x.toFixed(6).replace(/\.?0*$/,''); }
RegExp
匹配尾随零(以及可选的小数点),以确保它对整数看起来不错。
humanize(23-7.37) "15.63" humanize(1200) "1200" humanize(1200.03) "1200.03" humanize(3/4) "0.75" humanize(4/3) "1.333333"
var x = 0.3445434 x = Math.round (x*100) / 100 // this will make nice rounding
这个问题可能值得一个更多的答案:正如Dony和ArteQ所提到的,舍入受到精度损失的影响(也就是0.5可能变成0.49999 …)。 其结果是舍入既不是一半 ,也不是一半 ,或者其他任何一致的舍入方法,并且无论使用什么方法都会产生不一致的结果。
确实toFixed
也受到影响:
(0.335).toFixed(2) == 0.34 (0.345).toFixed(2) == 0.34
所以无论你使用哪种方法,如果你需要一致的四舍五入你最好添加(或删除)一个epsilon。
例如,使用 : toFixed
半舍去
var epsilon = 0.001; (0.335 + epsilon).toFixed(2) == 0.34; (0.345 + epsilon).toFixed(2) == 0.35;
如果你构build你自己的函数,在计算之前添加/删除一个epsilon也是一样的。
更新:
正如matias指出的那样,这种方法存在一个缺陷:无论哪个ε值0.334999999 …都会以0.34而不是0.35四舍五入。 因此,我们有一致性,但不是“标准四舍五入”。
所有这些使用乘法器的解决scheme都存在问题。 不幸的是,kkyy和Christoph的解决scheme都是错误的。
请testing您的代码为551.175有2个小数位 – 它将四舍五入到551.17,而它应该是551.18 ! 但是,如果你testing前。 451.175就可以了 – 451.18。 所以很难一眼就发现这个错误。
问题是乘法:尝试551.175 * 100 = 55117.49999999999(ups!)
所以我的想法是在使用Math.round()之前先用toFixed()处理它。
function roundFix(number, precision) { var multi = Math.pow(10, precision); return Math.round( (number * multi).toFixed(precision + 1) ) / multi; }
function trimNumber(num, len) { const modulu_one = 1; const start_numbers_float=2; var int_part = Math.trunc(num); var float_part = String(num % modulu_one); float_part = float_part.slice(start_numbers_float, start_numbers_float+len); return int_part+'.'+float_part; }
也许你也想要小数点分隔符? 这是我刚刚做的一个function:
function formatFloat(num,casasDec,sepDecimal,sepMilhar) { if (num < 0) { num = -num; sinal = -1; } else sinal = 1; var resposta = ""; var part = ""; if (num != Math.floor(num)) // decimal values present { part = Math.round((num-Math.floor(num))*Math.pow(10,casasDec)).toString(); // transforms decimal part into integer (rounded) while (part.length < casasDec) part = '0'+part; if (casasDec > 0) { resposta = sepDecimal+part; num = Math.floor(num); } else num = Math.round(num); } // end of decimal part while (num > 0) // integer part { part = (num - Math.floor(num/1000)*1000).toString(); // part = three less significant digits num = Math.floor(num/1000); if (num > 0) while (part.length < 3) // 123.023.123 if sepMilhar = '.' part = '0'+part; // 023 resposta = part+resposta; if (num > 0) resposta = sepMilhar+resposta; } if (sinal < 0) resposta = '-'+resposta; return resposta; }
无论采用乘法还是除法,都无法避免将x.xx5作为实际值进行不一致的四舍五入。 如果你需要计算客户端的正确价格,你应该保留所有金额在美分。 这是由于JavaScript中数值的内部表示的性质。 请注意,Excel遭受同样的问题,所以大多数人不会注意到这个现象造成的小错误。 然而,每当计算出大量的计算值时,错误就会累积起来,这里有一个完整的理论,涉及计算顺序和其他方法来最小化最终结果中的错误。 为了强调十进制值的问题,请注意在JavaScript中,0.1 + 0.2不等于0.3,而1 + 2等于3。
/** don't spend 5 minutes, use my code **/ function prettyFloat(x,nbDec) { if (!nbDec) nbDec = 100; var a = Math.abs(x); var e = Math.floor(a); var d = Math.round((ae)*nbDec); if (d == nbDec) { d=0; e++; } var signStr = (x<0) ? "-" : " "; var decStr = d.toString(); var tmp = 10; while(tmp<nbDec && d*tmp < nbDec) {decStr = "0"+decStr; tmp*=10;} var eStr = e.toString(); return signStr+eStr+"."+decStr; } prettyFloat(0); // "0.00" prettyFloat(-1); // "-1.00" prettyFloat(-0.999); // "-1.00" prettyFloat(0.5); // "0.50"
You can try this if you want don't want rounding `function myFunction() { var str = 12.234556; str = str.toString().split('.'); var res = str[1].slice(0, 2); document.getElementById("demo").innerHTML = str[0]+'.'+res; }` output:12.23