在Java中表示大十进制数的数据类型

8

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

如果尝试使用双精度浮点型:

double d = 10364055.81;

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

我应该使用BigDecimal吗?但它显示为10364055.81000000052154064178466796875。 有没有一种数据类型可以按原样显示值?而且这个数字可能比例子中的数字更大。

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

4个回答

19

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

new BigDecimal("10364055.81");

如果您将double传递给BigDecimal,Java必须首先创建该double - 由于双精度浮点数无法准确表示大多数小数分数,因此它会将值创建为10364055.81000000052154064178466796875,然后将其传递给BigDecimal构造函数。在这种情况下,BigDecimal无法知道您实际上想要的是更接近的版本。

一般来说,使用BigDecimal的非字符串构造函数应被视为警告,表明您没有充分利用该类。

编辑 - 根据重新阅读您要做的事情,我的初步说法可能太强烈了。 BigDecimal是当您需要精确表示十进制值时的一个很好的选择(处理货币是显而易见的选择,例如您不希望5.99 *一百万为5990016.45

但是,如果您不担心存储的数字在内部与您输入的十进制字面值略有不同,并且只想以相同的格式再次将其打印出来,则如其他人所说,NumberFormat的实例(在本例中为new DecimalFormat("########.##"))可以很好地输出双精度浮点数,或者String.format也可以做同样的事情。

关于性能 - 使用BigDecimals自然比使用原始数据类型慢。 不过,通常情况下,除非您的程序绝大部分涉及数学运算,否则您不太可能真正注意到任何速度差异。 这并不是说您应该在所有地方都使用BigDecimals; 而是,如果您可以从它们的功能中获得实际收益,并且很难或不可能通过普通的doubles实现,则不必担心它们在理论上引入的微小性能差异。


嗯,我认为你是对的。但是对于那个数字(只有两位小数),双精度数据类型应该足够了。在不必要使用BigDecimal的情况下使用它可能会导致某些操作性能低下。 - sinuhepop

4
一个数字的显示方式与其存储方式是不同的。
查看DecimalFormat,以控制在使用double(或float等)时如何显示数字。
请注意,选择BigDecimal还是double(反之亦然)都有利弊,并且取决于您的要求。请参见here获取更多信息。从摘要中可以看出:
“总之,如果原始性能和空间是最重要的因素,则适用原始浮点类型。如果需要精确表示十进制值,则需要高精度计算或希望对舍入进行精细控制,则只有BigDecimal具有所需的功能。”

1

1

你可以使用双精度和 display,如果需要可以使用 System.out.printf()。

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

.10f - 表示精度为10的双精度浮点数


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