当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何在javascript中格式化浮点数?》经验,为你挑选了7个好方法。

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



1> Tim Büthe..:

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

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

将打印5.04.

编辑: 小提琴


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

2> kkyy..:
var result = Math.round(original*100)/100;

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

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


这个答案实际上并不正确.使用toFixed.
`toFixed()`将模仿C中的'printf()`之类的内容.但是,`toFixed()`和`Math.round()`将以不同的方式处理舍入.在这种情况下,`toFixed()`将具有相同的效果`Math.floor()`将具有(授予你事先将原始乘以10 ^ n,并用n个数字调用`toFixed()`) .答案的"正确性"非常依赖于OP在这里想要的东西,并且两者都以他们自己的方式"正确".

3> Christoph..:

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

4> qbolec..:

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



5> Ilya Birman..:
var x = 0.3445434
x = Math.round (x*100) / 100 // this will make nice rounding



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;
}



7> 小智..:

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

推荐阅读
有风吹过best
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有