BigDecimal数字的格式

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

我希望将值0.20存储到val中,而不是0.2,有何方法?
在这种情况下,我不认为我可以使用NumberFormat。使用NumberFormat时必须知道小数位数的长度!我可能拥有0.200.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));

我接受了,但是还是0!!我该怎么办? - Mehdi
4个回答

7

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));

会抛出异常(这在你的评论中部分回答了你的疑虑)


如果我有:0.2222222222222222222222222222222...0?它是否超出了字符串?! - Mehdi
尝试创建一个值,其中小数位数超过String的最大长度;-) - Andreas Dolk

3
你正在将 double 值传递给 BigDecimal.valueOf() 方法,而且 0.20 和 0.2 是完全相同的 double 值。如果传递一个字符串,结果会有所不同,因为 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)

3

如果我有:0.2222222222222222222222222222222...0?它是否超出了字符串?! - Mehdi
2
你不了解你的问题。请先阅读BigDecimal javadoc文档。 - michael667

0

编辑:正如Andreas_D在评论中指出的那样,这个答案是错误的 :| 谢谢Andreas_D

问题在于0.2和0.20之间没有数学上的区别,所以你的唯一机会就是显示小数点后特定数量的数字。一旦你将0.2或0.20存储在BigDecimal中,它们就无法被区分开来。


2
这并不适用于BigDecimal ;) - Andreas Dolk
哦,抱歉!不知道那件事:| - Jonas Adler
我也是,第一次花了好几个小时来调试代码,因为我认为那两个大的十进制数是相等的 :-D - Andreas Dolk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接