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

420 javascript floating-point

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

Tim*_*the 808

有圆形数字的功能.例如:

var x = 5.0364342423;
print(x.toFixed(2));
Run Code Online (Sandbox Code Playgroud)

将打印5.04.

编辑: 小提琴

  • 注意这一点,toFixed()返回一个字符串:`var x = 5.036432346; var y = x.toFixed(2)+ 100;``y`将等于`"5.03100"` (66认同)
  • 我建议不要在浏览器中使用print() (7认同)
  • 另外,要注意不一致的舍入:`(0.335).toFixed(2)== 0.34 ==(0.345).toFixed(2)`... (7认同)
  • 请注意(1e100).toFixed(2)==="1e + 100" (5认同)
  • @Berov:那不是真的,看我的小提琴. (2认同)
  • 如果您搜索等效于toFixed但具有一致的舍入,请使用toLocaleString:(0.345).toLocaleString('en-EN',{minimumFractionDigits:2,maximumFractionDigits:2}) (2认同)

kky*_*kyy 228

var result = Math.round(original*100)/100;
Run Code Online (Sandbox Code Playgroud)

具体情况,如果代码不能自我解释.

编辑:......或者只是toFixed按照TimBüthe的建议使用.忘了一个,谢谢(和一个upvote)提醒:)

  • 这个答案实际上并不正确.使用toFixed. (102认同)
  • `toFixed()`将模仿C中的'printf()`之类的内容.但是,`toFixed()`和`Math.round()`将以不同的方式处理舍入.在这种情况下,`toFixed()`将具有相同的效果`Math.floor()`将具有(授予你事先将原始乘以10 ^ n,并用n个数字调用`toFixed()`) .答案的"正确性"非常依赖于OP在这里想要的东西,并且两者都以他们自己的方式"正确". (2认同)
  • 不幸的是,这里提出的方法不是一个好的方法,因为由于二进制基数的工作原理,它可能会导致意外的值,例如 4.99999999998 等。请改用 toFixed。 (2认同)

Chr*_*oph 182

使用时要小心toFixed():

首先,使用数字的二进制表示来完成数字舍入,这可能会导致意外行为.例如

(0.595).toFixed(2) === '0.59'
Run Code Online (Sandbox Code Playgroud)

而不是'0.6'.

其次,有一个IE漏洞toFixed().在IE中(至少到版本7,没有检查IE8),以下情况属实:

(0.9).toFixed(0) === '0'
Run Code Online (Sandbox Code Playgroud)

遵循kkyy的建议或使用自定义toFixed()函数可能是个好主意,例如

function toFixed(value, precision) {
    var power = Math.pow(10, precision || 0);
    return String(Math.round(value * power) / power);
}
Run Code Online (Sandbox Code Playgroud)

  • 我建议在返回值中添加原生`.toFixed()`方法,这将添加所需的精度,例如:`return(Math.round(value*power)/ power).toFixed(precision);`并将值作为字符串返回.否则,对于较小的小数,将忽略20的精度 (10认同)
  • 关于`toFixed`的一个注意事项:请注意,增加精度会产生意外结果:`(1.2).toFixed(16)==="1.2000000000000000"`,而`(1.2).toFixed(17)==="1.19999999999999996" `(在Firefox/Chrome中;在IE8中,后者由于IE8内部提供的精度较低而无法保留). (3认同)
  • 请注意,即使`(0.598).toFixed(2)`也不会产生`0.6`.它产生`0.60` :) (2认同)

qbo*_*lec 34

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

var x=(23-7.37)
x
15.629999999999999
x.toFixed(6)
"15.630000"
Run Code Online (Sandbox Code Playgroud)

我的想法是使用以下方法清理输出RegExp:

function humanize(x){
  return x.toFixed(6).replace(/\.?0*$/,'');
}
Run Code Online (Sandbox Code Playgroud)

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"
Run Code Online (Sandbox Code Playgroud)

  • 尾随零可能很烦人,但这正是方法名称“toFixed”承诺要做的事情;) (2认同)

Ily*_*man 10

var x = 0.3445434
x = Math.round (x*100) / 100 // this will make nice rounding
Run Code Online (Sandbox Code Playgroud)


小智 6

使用乘数的所有解决方案都存在问题.不幸的是,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;
}
Run Code Online (Sandbox Code Playgroud)

  • 这就是js中算术的问题:(551.175 * 10 * 10) !== (551.175 * 100)。您必须使用小数增量来移动逗号以获得​​非真正的小数结果。 (2认同)

Ste*_*ven 5

我猜这里的关键是首先正确地取整,然后可以将其转换为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
Run Code Online (Sandbox Code Playgroud)

现在,您可以使用toFixed(p)安全地设置此值的格式。因此,根据您的具体情况:

roundOf(0.3445434, 2).toFixed(2); // 0.34
Run Code Online (Sandbox Code Playgroud)