8

哪种数据类型易于表示像“10364055.81”这样的十进制数。

如果尝试使用双精度:

double d = 10364055.81;

但是当我尝试打印数字时,它显示为“ 1.036405581E7 ”,这是我不想要的。

我应该使用 BigDecimal 吗?但它显示为10364055.81000000052154064178466796875。是否有任何数据类型可以按原样显示值?此外,该数字可能大于作为示例的数字。

顺便说一句,使用 BigDecimal 会影响应用程序的性能吗?我可能会在几乎所有的 DTO 中使用它。

4

4 回答 4

19

您应该使用 BigDecimal - 但使用 String 构造函数,例如:

new BigDecimal("10364055.81");

如果将 a 传递double给 BigDecimal,Java 必须首先创建该双精度 - 由于双精度无法准确表示大多数小数,它确实创建了值 as10364055.81000000052154064178466796875然后将传递给 BigDecimal 构造函数。在这种情况下,BigDecimal 无法知道您实际上是指更圆的版本。

一般来说,使用 BigDecimal 的非 String 构造函数应该被视为一个警告,即您没有获得该类的全部好处。

编辑-基于重新阅读您想要做的事情,我最初的主张可能太强了。当您需要精确表示十进制值时,BigDecimal 是一个不错的选择(金钱处理是显而易见的选择,例如,您不希望 5.99 * 一百万5990016.45

但是,如果您不担心数字在内部存储为与您输入的十进制文字略有不同的值,并且只想以相同的格式再次打印出来,那么正如其他人所说,NumberFormat(在在这种情况下,new DecimalFormat("########.##")) 可以很好地输出双精度,或者String.format可以做同样的事情。

至于性能 - BigDecimals 自然会比使用原语慢。但是,通常情况下,除非您的程序的绝大多数都涉及数学运算,否则您实际上不太可能注意到任何速度差异。这并不是说您应该全部使用 BigDecimals。相反,如果您可以从它们的功能中获得真正的好处,而这些功能使用 plain 很难或不可能实现doubles,那么不要担心它们理论上引入的微小性能差异。

于 2009-10-22T09:04:02.793 回答
4

数字的显示方式与数字的存储方式不同

查看DecimalFormat以控制在双精度(或浮点数等)时如何显示数字。

请注意,选择 BigDecimal 而不是 double (反之亦然)有利有弊,具体取决于您的要求。请参阅此处了解更多信息。从总结:

总之,如果原始性能和空间是最重要的因素,原始浮点类型是合适的。如果需要精确表示十进制值,需要高精度计算,或者需要精细控制舍入,则只有 BigDecimal 具有所需的功能。

于 2009-10-22T09:03:58.197 回答
1

为了保存这个数字,双倍就足够了。如果您的问题是在打印或将其放入字符串时不喜欢该格式,您可以使用 NumberFormat:http: //java.sun.com/javase/6/docs/api/java/text/NumberFormat.html

于 2009-10-22T09:05:40.750 回答
1

you can use double and display if with System.out.printf().

double d = 100003.81;
System.out.printf("%.10f", d);

.10f - means a double with precision of 10

于 2009-10-22T09:09:31.473 回答