在JavaScript中,当从浮点数转换为字符串时,如何才能在小数点后得到2位数字?例如,0.34而不是0.3445434。


当前回答

countDecimals = value => { if (Math.floor(value) === value) return 0; let stringValue = value.toString().split(".")[1]; if (stringValue) { return value.toString().split(".")[1].length ? value.toString().split(".")[1].length : 0; } else { return 0; } }; formatNumber=(ans)=>{ let decimalPlaces = this.countDecimals(ans); ans = 1 * ans; if (decimalPlaces !== 0) { let onePlusAns = ans + 1; let decimalOnePlus = this.countDecimals(onePlusAns); if (decimalOnePlus < decimalPlaces) { ans = ans.toFixed(decimalPlaces - 1).replace(/\.?0*$/, ""); } else { let tenMulAns = ans * 10; let decimalTenMul = this.countDecimals(tenMulAns); if (decimalTenMul + 1 < decimalPlaces) { ans = ans.toFixed(decimalPlaces - 1).replace(/\.?0*$/, ""); } } } }

我只是给这个值加上1,然后数出原始值和增加的值中出现的十进制数字。如果我在比原始十进制数字少加1之后找到十进制数字,我只调用toFixed() with(原始小数- 1)。我还通过将原始值乘以10来检查,并遵循相同的逻辑,以防加1不会减少冗余小数位。 在JS中处理浮点数舍入的简单变通方法。我试过的大多数情况下都有效。

其他回答

有一些函数可以取整数字。例如:

var x = 5.0364342423;
print(x.toFixed(2));

将打印5.04。

编辑: 小提琴

另一个需要注意的问题是,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"

我认为这里的关键是首先正确地舍入,然后您可以将其转换为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

使用toFixed()时要小心:

首先,使用数字的二进制表示来四舍五入,这可能会导致意想不到的行为。例如

(0.595).toFixed(2) === '0.59'

而不是‘0.6’。

其次,toFixed()存在IE错误。在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);
}
var result = Math.round(original*100)/100;

具体细节,以防代码不是自解释的。

编辑:…或者直接使用toFixed,就像Tim Büthe提议的那样。忘记了,谢谢你的提醒(还有点赞):)