代碼如下,java用BigDecimal四舍五入怎么還有問題呀?哪種方式是完全沒有問題的?
問題描述
1.為什么不是1.51?輸出的是1.50
2.decimalformat括號里的字符串代表了什么意思?有模板嗎?如果是別的格式應該怎么寫
3.為什么要用#號而不是0.00?如果是#好的話,當a是0.505的時候有bug
double a =1.505;BigDecimal bd = new BigDecimal(a);System.out.println(new DecimalFormat('#.00').format(bd));
問題解答
回答1:首先,指出一個問題:構建 BigDecimal 的時候,盡量不要使用浮點數(double,float),因為浮點數在計算機中的存儲存在精度缺失問題。比如你的寫的代碼:
public static void main(String[] args) throws Exception { double a = 1.505; BigDecimal bd = new BigDecimal(a); System.out.println('bd: ' + bd.toString());}
運行結果:
可以看到,浮點數 1.505 在計算機中沒法存儲的 —— 具體原因如果不知道,請自行搜索 “浮點數精度缺失問題”
第二,如果需要輸出 1.51,即常說的 “四舍五入”,那么需要指定 DecimalFormat 的舍入模式:
public static void main(String[] args) throws Exception { BigDecimal bd = new BigDecimal('1.505'); System.out.println('bd: ' + bd.toString()); DecimalFormat df = new DecimalFormat('#.00'); df.setRoundingMode(RoundingMode.HALF_UP); System.out.println('format: ' + df.format(bd));}
運行結果:
如果不了解 RoundingMode 的用法,請自行搜索 “RoundingMode 的用法”
第三,關于 DecimalFormat 括號里的字符串代表的意思,請自行搜索 “DecimalFormat 的用法”
回答2:System.out.println(String.format('%.2f', a)); System.out.println(new Formatter().format('%.2f', a));這兩種是可以的。 double d = 5.505; System.out.println(d) 輸出的是1.504xxxxxxxxx,所以java在做四舍五入的時候舍掉了后面的4xxxxxx。 等待大神解答
相關文章:
