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

回答(13)

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

我猜的关键是首先正确地向上舍入,然后你可以将它转换为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

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

function trimNumber(num, len) {

const modulu_one = 1;

const start_numbers_float=2;

var int_part = Math.trunc(num);

var float_part = String(num % modulu_one);

float_part = float_part.slice(start_numbers_float, start_numbers_float+len);

return int_part+'.'+float_part;

}

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

/** don't spend 5 minutes, use my code **/

function prettyFloat(x,nbDec) {

if (!nbDec) nbDec = 100;

var a = Math.abs(x);

var e = Math.floor(a);

var d = Math.round((a-e)*nbDec); if (d == nbDec) { d=0; e++; }

var signStr = (x<0) ? "-" : " ";

var decStr = d.toString(); var tmp = 10; while(tmp

var eStr = e.toString();

return signStr+eStr+"."+decStr;

}

prettyFloat(0); // "0.00"

prettyFloat(-1); // "-1.00"

prettyFloat(-0.999); // "-1.00"

prettyFloat(0.5); // "0.50"

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

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

var x = 5.0364342423;

print(x.toFixed(2));

将打印5.04 .

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

var result = Math.round(original*100)/100;

The specifics,如果代码不能自我解释 .

编辑:...或者只使用 toFixed ,由Tim Büthe提议 . 忘了一个,谢谢(和一个upvote)提醒:)

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

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

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

var x = 0.3445434

x = Math.round (x*100) / 100 // this will make nice rounding

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

所有那些使用乘数浮动的解决方案都存在问题 . 不幸的是,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;

}

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

也许你还想要小数分隔符?这是我刚刚制作的一个功能:

function formatFloat(num,casasDec,sepDecimal,sepMilhar) {

if (num < 0)

{

num = -num;

sinal = -1;

} else

sinal = 1;

var resposta = "";

var part = "";

if (num != Math.floor(num)) // decimal values present

{

part = Math.round((num-Math.floor(num))*Math.pow(10,casasDec)).toString(); // transforms decimal part into integer (rounded)

while (part.length < casasDec)

part = '0'+part;

if (casasDec > 0)

{

resposta = sepDecimal+part;

num = Math.floor(num);

} else

num = Math.round(num);

} // end of decimal part

while (num > 0) // integer part

{

part = (num - Math.floor(num/1000)*1000).toString(); // part = three less significant digits

num = Math.floor(num/1000);

if (num > 0)

while (part.length < 3) // 123.023.123 if sepMilhar = '.'

part = '0'+part; // 023

resposta = part+resposta;

if (num > 0)

resposta = sepMilhar+resposta;

}

if (sinal < 0)

resposta = '-'+resposta;

return resposta;

}

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

使用_410963时要小心:

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

(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);

}

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

使用乘法或除法,无法避免x.xx5作为实际值的价格不一致舍入 . 如果您需要在客户端计算正确的价格,您应该将所有金额保持在美分 . 这是由于JavaScript中数值的内部表示的性质 . 请注意,Excel遇到了同样的问题,因此大多数人都不会注意到这个现象引起的小错误 . 但是,无论何时添加大量计算值,错误都可能累积,有一个完整的理论涉及计算顺序和其他方法,以最小化最终结果中的错误 . 为了强调十进制值的问题,请注意在JavaScript中0.1 0.2并不完全等于0.3,而1 2等于3 .

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

我使用此代码来格式化浮点数 . 它基于 toPrecision() ,但它删除了不必要的零 . 我欢迎有关如何简化正则表达式的建议 .

function round(x, n) {

var exp = Math.pow(10, n);

return Math.floor(x*exp + 0.5)/exp;

}

用法示例:

function test(x, n, d) {

var rounded = rnd(x, d);

var result = rounded.toPrecision(n);

result = result.replace(/\.?0*$/, '');

result = result.replace(/\.?0*e/, 'e');

result = result.replace('e+', 'e');

return result;

}

document.write(test(1.2000e45, 3, 2) + '=' + '1.2e45' + '
');

document.write(test(1.2000e+45, 3, 2) + '=' + '1.2e45' + '
');

document.write(test(1.2340e45, 3, 2) + '=' + '1.23e45' + '
');

document.write(test(1.2350e45, 3, 2) + '=' + '1.24e45' + '
');

document.write(test(1.0000, 3, 2) + '=' + '1' + '
');

document.write(test(1.0100, 3, 2) + '=' + '1.01' + '
');

document.write(test(1.2340, 4, 2) + '=' + '1.23' + '
');

document.write(test(1.2350, 4, 2) + '=' + '1.24' + '
');

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

如果您不想使用舍入,可以尝试此操作

function myFunction() {

var str = 12.234556;

str = str.toString().split('.');

var res = str[1].slice(0, 2);

document.getElementById("demo").innerHTML = str[0]+'.'+res;

}

output:12.23

str.toString().split('.') 会将您的浮点数转换为字符串然后将其拆分为'.'

产生的变量将是一个带有两个字符串类型元素的数组,第一个元素将是12,第二个元素将是234556

str[1].slice(0, 2) 会将你的第二个(234556)字符串切成前两个字符,即23

然后通过 str[0]+'.'+res 连接第一个和结果字符串

希望这会有所帮助

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值