java保留小數點後四捨五入的問題

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章