java保留小數點後四舍五入的問題
阿新 • • 發佈:2017-10-11
四舍五入
在Java中使用一些方法進行四舍五入會出現和預期不同的結果,這是因為這些方法使用的原則實際為:四舍六入五考慮,五後非零就進一,五後皆零看奇偶,五前為偶應舍去,五前為奇要進一。
1.四舍六入五考慮時出現五的情況
double f=9.545d; System.out.println(new BigDecimal(f).setScale(2,BigDecimal.ROUND_HALF_UP).doubleValue()); System.out.println(new java.text.DecimalFormat("#.00").format(f)); System.out.println(); f=9.555d; System.out.println(new BigDecimal(f).setScale(2,BigDecimal.ROUND_HALF_UP).doubleValue()); System.out.println(new java.text.DecimalFormat("#.00").format(f)); System.out.println(); f=9.5551d; System.out.println(new BigDecimal(f).setScale(2,BigDecimal.ROUND_HALF_UP).doubleValue()); System.out.println(new java.text.DecimalFormat("#.00").format(f)); 運行結果: 9.54 9.54 9.55 9.55 9.56 9.56
2.四舍五入時出現五的情況
double f=9.545d; System.out.println(String.format("%.2f", f)); System.out.println(Math.round(f*100)*0.01); System.out.println(); f=9.555d; System.out.println(String.format("%.2f", f)); System.out.println(Math.round(f*100)*0.01); System.out.println(); f=9.5551d; System.out.println(String.format("%.2f", f)); System.out.println(Math.round(f*100)*0.01); 運行結果: 9.55 9.55 9.56 9.56 9.56 9.56
所以,從上邊運行的情況來看,如果需要嚴格遵守四舍五入,需要使用第二種情況才可以。(ps:這裏順便提一下,js中使用toFixed其實是四舍六如五考慮的情況,如果希望嚴格的四舍五入,可以使用(Math.round(a*100)/100).toFixed(2)。但是mysql的ROUND方法卻是四舍五入的)
本文出自 “塞上名豬” 博客,請務必保留此出處http://zuohao1990.blog.51cto.com/6057850/1971437
java保留小數點後四舍五入的問題