BigDecimal 数字的格式

Posted

技术标签:

【中文标题】BigDecimal 数字的格式【英文标题】:Format of BigDecimal number 【发布时间】:2012-05-18 13:39:57 【问题描述】:
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 !我能做什么? 【参考方案1】:

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

会抛出异常(部分回答了您对 cme​​ts 的担忧)

【讨论】:

如果我有:0.2222222222222222222222222222222...0?它超过了字符串?! (尝试用一个值创建它,其中小数位数超过String的最大长度;-))【参考方案2】:

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

【讨论】:

如果我有:0.2222222222222222222222222222222...0?它超过了字符串?! 你不明白你的问题。请先阅读 BigDecimal javadoc。【参考方案3】:

你将一个 double 传递给 BigDecimal.valueOf()。而0.200.2 完全相同。传一个String,结果会不一样,因为BigDecimal的小数位数会从String中的小数位数推导出来:

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)

【讨论】:

【参考方案4】:

编辑:正如 cmets 中指出的那样,这个答案是错误的:|谢谢安德烈亚斯_D

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

【讨论】:

那是错误的,BigDecimal 不是这样;) 哦,对不起!不知道:| (我也是,首先,我花了 小时 来调试一些我 认为 的代码,这两个大小数相等 :-D )

以上是关于BigDecimal 数字的格式的主要内容,如果未能解决你的问题,请参考以下文章

BigDecimal类型比较大小

bigdecimal的使用

将浮点数格式化为 n 位小数

有没有办法将格式化的 BigDecimal 数字分配给 BigDecimal?

BigDecimal 数字的格式

Java连载80-数字类格式随机数BigDecimal