0

我正在尝试格式化金额。但十进制值没有以正确的方式四舍五入。

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

4 回答 4

2

默认情况下DecimalFormat使用舍入HALF_EVEN 模式

如果丢弃的分数左边的数字是奇数,则行为与 RoundingMode.HALF_UP 相同;如果是偶数,其行为与 RoundingMode.HALF_DOWN 相同。

在这种情况下,of 的倒数第二个最低有效数字是偶数,因此该值向下舍入。相反, 的值是奇数,因此在随后的语句中进行了四舍五入。41974.5453format

尝试使用RoundingMode.HALF_UP.

testing.dispAmt.setRoundingMode(RoundingMode.HALF_UP);
于 2013-10-28T11:29:01.310 回答
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);
于 2013-10-28T11:28:27.260 回答
0

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

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

有很多RoundingMode可用的。请检查文档。

于 2013-10-28T11:28:40.233 回答
0

DecimalFormat 是 NumberFormat 的一个具体子类,用于格式化十进制数。这并没有对给定的数字进行四舍五入。INFO 这只是使用给定的模式来显示数字。

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

于 2013-10-28T11:30:24.723 回答