(以下使用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.但我认为这是后来的编辑,然后我开始查看它。使用#。#。