如何在javascript中格式化浮点数?

IT技术 javascript floating-point
2021-01-24 01:33:03

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

6个回答

有四舍五入的函数。例如:

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

将打印 5.04。

编辑: 小提琴

另外,请注意不一致的舍入:(0.335).toFixed(2) == 0.34 == (0.345).toFixed(2)...
2021-03-16 01:33:03
小心这一点,toFixed() 返回一个字符串:var x = 5.036432346; var y = x.toFixed(2) + 100; y将等于"5.03100"
2021-03-27 01:33:03
我建议不要在浏览器中使用 print()
2021-03-30 01:33:03
请注意 (1e100).toFixed(2) === "1e+100"
2021-04-06 01:33:03
如果您搜索等效的 toFixed 但具有一致的舍入,请使用 toLocaleString : (0.345).toLocaleString('en-EN',{minimumFractionDigits:2, maximumFractionDigits:2})
2021-04-07 01:33:03
var result = Math.round(original*100)/100;

细节,以防代码不言自明。

编辑:...或者只是使用toFixed,正如Tim Büthe所提议的那样忘了那个,谢谢(和赞成)提醒:)

不幸的是,这里提出的方法不是一个好的方法,因为它可能会导致意外的值,如 4.99999999998 等,因为二进制基数的工作方式。请改用 toFixed。
2021-03-19 01:33:03
我在库“Highchart”中使用它,它不接受字符串值,因此 toFixed 对我不起作用,Math.round 解决了我的问题,谢谢
2021-04-02 01:33:03
toFixed()会模仿什么像printf()做在C.然而,toFixed()Math.round()将处理舍入不同。在这种情况下,toFixed()将具有相同的效果Math.floor()(假设您事先将原始值乘以 10^n,并toFixed()用 n 位数字调用)。答案的“正确性”非常依赖于 OP 在这里想要什么,并且两者都以自己的方式“正确”。
2021-04-10 01:33:03

使用时要小心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);
}
是的,这在创建预测价格的代码时非常重要。谢谢!+1
2021-03-14 01:33:03
一个关于toFixed:注意提高精度会产生意想不到的结果:(1.2).toFixed(16) === "1.2000000000000000",而(1.2).toFixed(17) === "1.19999999999999996"(在 Firefox/Chrome 中;在 IE8 中,由于 IE8 可以在内部提供较低的精度,后者不成立)。
2021-03-15 01:33:03
请注意,即使(0.598).toFixed(2)不产生0.6. 它产生0.60:)
2021-03-17 01:33:03
另外,请注意不一致的舍入:(0.335).toFixed(2) == 0.34 == (0.345).toFixed(2).
2021-03-24 01:33:03
我建议.toFixed()在返回值中添加本机方法,这将添加所需的精度,例如:return (Math.round(value * power) / power).toFixed(precision);并将值作为字符串返回。否则,对于较小的小数将忽略 20 的精度
2021-03-25 01:33:03

另一个需要注意的问题是,toFixed()可能会在数字末尾产生不必要的零。例如:

var x=(23-7.37)
x
15.629999999999999
x.toFixed(6)
"15.630000"

这个想法是使用 a 清理输出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"
这应该被接受,尾随零很烦人,我正在寻找这个解决方案,gj。
2021-03-18 01:33:03
尾随零可能很烦人,但这正是方法名称“toFixed”所Promise的;)
2021-03-31 01:33:03
Number.prototype.minFixed = function(decimals) { return this.toFixed(decimals).replace(/\.?0*$/, ""); }
2021-04-08 01:33:03
var x = 0.3445434
x = Math.round (x*100) / 100 // this will make nice rounding
console.log(Math.round((1.015 + 0.00001) * 100) / 100) // 1.02 这将解决上述情况
2021-03-12 01:33:03
Math.round(1.015 * 100) / 100 给出 1.01 而我们期望它是 1.02 ?
2021-04-01 01:33:03