BigDecimal数字的格式

BigDecimal val = BigDecimal.valueOf(0.20); System.out.println(a); 

我想存储val值0.20而不是0.2 。 我可以做什么 ?

在这种情况下,我不认为我可以使用NumberFormat ,当我使用NumberFormat我必须知道我的十进制数的长度是多少! 我可以有0.20或0.5000,我不知道我的十进制数的确切长度,所以我不能使用:

 DecimalFormat df = new DecimalFormat("#0.00"); 

要么

 DecimalFormat df = new DecimalFormat("#0.00000"); 

也许我只有2个数字后点或5个或更多的数字,这个程序不起作用:

  BigDecimal a = BigDecimal.valueOf(0.20);//i give an example of 0.2 i can have 0.98...0 System.out.println(a); NumberFormat nf1 = NumberFormat.getInstance(); System.out.println(nf1.format(0.5000)); 

您可以使用BigDecimal的String构造函数。 它保留了规模(这是你想要的)。

 BigDecimal val = new BigDecimal("0.20"); 

请参阅http://docs.oracle.com/javase/1.5.0/docs/api/java/math/BigDecimal.html#BigDecimal(java.lang.String )

BigDecimal会记住尾随的零 – 有一些重要的副作用:

 BigDecimal bd1 = new BigDecimal("0.20"); BigDecimal bd2 = new BigDecimal("0.2"); System.out.println(bd1); System.out.println(bd2); System.out.println(bd1.equals(bd2)); 

将打印

 0.20 0.2 false 

我们需要记住,我们不能将BiGDecimal用于数字,其中十进制扩展具有句点:

 BigDecimal.ONE.divide(new BigDecimal(3)); 

将抛出exception(在您的评论中部分回答您的疑虑)

你将一个double传递给BigDecimal.valueOf()0.200.2完全相同。 传递一个字符串,结果会有所不同,因为BigDecimal的比例将从字符串中的小数位数推导出来:

 BigDecimal bd1 = new BigDecimal("0.20"); BigDecimal bd2 = new BigDecimal("0.2"); System.out.println(bd1.toPlainString() + ", scale = " + bd1.scale()); // 0.20, scale = 2 System.out.println(bd2.toPlainString() + ", scale = " + bd2.scale()); // 0.2, scale = 1 NumberFormat nf = NumberFormat.getInstance(); nf.setMinimumFractionDigits(bd1.scale()); System.out.println(nf.format(bd1)); // 0,20 (in French locale) nf.setMinimumFractionDigits(bd2.scale()); System.out.println(nf.format(bd2)); // 0,2 (in French locale) 

编辑:这个答案是错误的,如评论中所指出:| thx Andreas_D

问题是0.2和0.20之间没有数学差异所以你唯一的机会是在小数点后面显示一定数量的数字。 一旦你在BigDecimal存储0.2或0.20,它们就无法区分