是否DecimalFormat在舍入时不考虑小数值?

时间:2013-10-28 11:25:27

标签: java

我试图格式化数量。但是十进制值没有以正确的方式舍入。

public class Testing {    
    private java.text.DecimalFormat dispAmt;    
    public Testing() {                
    }    
    public static void main(String args[]){   
       Testing testing=new Testing();    
       testing.dispAmt = new java.text.DecimalFormat("##,##,##0.00");   
       // Line #8
       System.out.println(testing.dispAmt.format(1974.545));     
       System.out.println(testing.dispAmt.format(1974.535));   
    }   
 }    

OutPut:
=========
1,974.54    
1,974.54


         在上面的编程中,第8行出了什么问题。为什么它不是四舍五入为“1,974.55”?在哪里做错了!!请建议..

4 个答案:

答案 0 :(得分:2)

默认情况下,DecimalFormat使用HALF_EVEN which

的舍入模式
  如果丢弃的分数左边的数字是奇数,则

的行为与RoundingMode.HALF_UP相同;如果它是偶数,则表现为RoundingMode.HALF_DOWN。

在这种情况下,4的{​​{1}}的第二个最低有效数字甚至是向下舍入的值。相反,1974.545的值是奇数,因此在随后的3语句中出现了舍入。

尝试使用format

RoundingMode.HALF_UP

答案 1 :(得分:1)

DecimalFormat#format没有舍入!它只是切断了默认情况下不显示的值。

  

DecimalFormat使用半偶数舍入(请参阅ROUND_HALF_EVEN)进行格式设置。

http://docs.oracle.com/javase/6/docs/api/java/text/DecimalFormat.html

您必须手动设置RoundingMode

dispAmt.setRoundingMode(RoundingMode.HALF_UP);

答案 2 :(得分:0)

您需要使用RoundingMode方法设置格式化程序的setRoundingMode(),因为默认情况下,它不会对值进行舍入。

dispAmt.setRoundingMode(RoundingMode.CEILING); // Ex 1
dispAmt.setRoundingMode(RoundingMode.HALF_UP); // Ex 2 but I guess you need this in your case

有许多RoundingMode可用。请检查文档。

答案 3 :(得分:0)

DecimalFormat是NumberFormat的具体子类,用于格式化十进制数。这并没有围绕给定的数字。 INFO 这只是使用您给出的模式来显示数字。

DecimalFormat提供RoundingMode中定义的舍入模式以进行格式化。默认情况下,它使用RoundingMode.HALF_EVEN。