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));
答案 0 :(得分: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));
会抛出异常(在您的评论中部分回答您的疑虑)
答案 1 :(得分:3)
您可以使用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)
答案 2 :(得分:3)
你将双人传递给BigDecimal.valueOf()
。而0.20
与0.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)
答案 3 :(得分:0)
编辑:这个答案是错误的,如评论中所指出的:| thx Andreas_D
问题是0.2和0.20之间没有数学差异,因此您唯一的机会是在小数点后显示一定数量的数字。一旦在BigDecimal
中存储0.2或0.20,它们就无法区分