java roundingmode.UP,即使明确设置,DecimalFormat也使用不正确的RoundingMode

本文探讨了在Java8中使用DecimalFormat进行浮点数格式化时,0.15和0.05的舍入问题。通过实例展示了如何使用BigDecimal和正确的valueOf方法确保正确舍入,并解释了掩码设置对结果的影响。
摘要由CSDN通过智能技术生成

(以下使用Java 8回答。)

您看到的问题来自于指定" 0.15"或" 0.05"在代码中,当表示为double时,略小于0.15。看看这个

DecimalFormat df = new DecimalFormat("#.#");

df.setRoundingMode(RoundingMode.HALF_UP);

BigDecimal bd = new BigDecimal(0.15);

System.out.println("bd=" + bd);

System.out.println(df.format(0.15)); // expecting 0.1, getting 0.1

bd = new BigDecimal(0.05);

System.out.println("bd=" + bd);

System.out.println(df.format(0.05));

bd = new BigDecimal(0.06);

System.out.println("bd=" + bd);

System.out.println(df.format(0.06));

此代码的输出是

bd=0.1499999999999999944488848768742172978818416595458984375

0.1

bd=0.05000000000000000277555756156289135105907917022705078125

0.1

bd=0.059999999999999997779553950749686919152736663818359375

0.1

一个可能的解决方案(如果你绝对需要它以正确的方式进行舍入)是使用BigDecimal.valueOf来创建值。例如

BigDecimal bd = BigDecimal.valueOf(0.15);

System.out.println("bd=" + bd);

System.out.println(df.format(bd)); // expecting 0.1, getting 0.1

bd = BigDecimal.valueOf(0.05);

System.out.println("bd=" + bd);

System.out.println(df.format(bd));

bd = BigDecimal.valueOf(0.06);

System.out.println("bd=" + bd);

System.out.println(df.format(bd));

现在会产生

bd=0.15

0.2

bd=0.05

0.1

bd=0.06

0.1

顺便说一下,正如Scary Wombat指出的那样,掩码设置为0.0而不是#。#将使0.6为0.但我认为这是后来的编辑,然后我开始查看它。使用#。#。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值