大十进制数的格式


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 会记住尾随的零 - 有一些明显的副作用:

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

将抛出异常(部分回答您在评论中的担忧(

您可以使用 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.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)

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

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

最新更新