在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方法卻是四捨五入的)