在JavaScript中,当从float转换为字符串时,如何在小数点后只获得2位数?例如,0.34而不是0.3445434.
有圆形数字的功能.例如:
var x = 5.0364342423; print(x.toFixed(2));
将打印5.04.
编辑: 小提琴
var result = Math.round(original*100)/100;
具体情况,如果代码不能自我解释.
编辑:......或者只是toFixed
按照TimBüthe的建议使用.忘了一个,谢谢(和一个upvote)提醒:)
使用时要小心toFixed()
:
首先,使用数字的二进制表示来完成数字舍入,这可能会导致意外行为.例如
(0.595).toFixed(2) === '0.59'
而不是'0.6'
.
其次,有一个IE漏洞toFixed()
.在IE中(至少到版本7,没有检查IE8),以下情况属实:
(0.9).toFixed(0) === '0'
遵循kkyy的建议或使用自定义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
使用乘数的所有解决方案都存在问题.不幸的是,kkyy和Christoph的解决方案都是错误的.
请测试您的代码为551.175,带有2位小数 - 它将舍入到551.17,而它应该是551.18!但如果你测试前.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; }
我猜这里的关键是首先正确地取整,然后可以将其转换为String。
function roundOf(n, p) {
const n1 = n * Math.pow(10, p + 1);
const n2 = Math.floor(n1 / 10);
if (n1 >= (n2 * 10 + 5)) {
return (n2 + 1) / Math.pow(10, p);
}
return n2 / Math.pow(10, p);
}
// All edge cases listed in this thread
roundOf(95.345, 2); // 95.35
roundOf(95.344, 2); // 95.34
roundOf(5.0364342423, 2); // 5.04
roundOf(0.595, 2); // 0.60
roundOf(0.335, 2); // 0.34
roundOf(0.345, 2); // 0.35
roundOf(551.175, 2); // 551.18
roundOf(0.3445434, 2); // 0.34
现在,您可以使用toFixed(p)安全地设置此值的格式。因此,根据您的具体情况:
roundOf(0.3445434, 2).toFixed(2); // 0.34