2009-10-22 42 views
5

哪种数据类型易于表示十进制数字,如“10364055.81”。数据类型在java中表示一个十进制数字

如果使用双试过:

double d = 10364055.81; 

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

我应该使用BigDecimal吗?但其显示为10364055.81000000052154064178466796875。 是否有任何显示值的数据类型?这个数字可能会比作为例子。

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

回答

17

你应该用BigDecimal的 - 但使用String构造,如:

new BigDecimal("10364055.81"); 

如果传递一个double为BigDecimal,爪哇必须创建一个双第一 - 既然双打不能代表大多数小数分数准确,它确实创建值为10364055.81000000052154064178466796875然后将它传递给BigDecimal构造函数。在这种情况下,BigDecimal无法知道您实际上是否意味着更为圆润的版本。

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

编辑 - 基于重读正是你想要做的,我最初的主张可能太强大了。当您需要准确表示小数值时,BigDecimal是一个不错的选择(货币处理是显而易见的选择,例如,您不希望5.99 *一百万为5990016.45

但是,如果你不担心次数存储内部是一个非常略有不同的值到您输入的十进制文字,只是想以相同的格式再打印出来,然后像其他人说,NumberFormat(在这种情况下,new DecimalFormat("########.##"))的一个实例将会很好地输出双精度值,或者String.format可以做同样的事情。

至于性能 - BigDecimals自然会比使用原语慢。但是,通常情况下,除非您的程序的绝大多数涉及数学操作,否则您不可能真正注意到任何速度差异。这并不是说你应该使用BigDecimals;而是说,如果你能从他们的功能中获得真正的好处,而用简单的doubles难以或不可能实现这些功能,那么不要为他们在理论上引入的微小的性能差异而烦恼。

+0

精度的双嗯,我想你是对的。但是双数据类型必须足够用于该数字(只有两位小数)。使用双倍的BigDecimal可以在执行某些操作时导致低性能。 – sinuhepop

3

如何显示一个数字是不同从数字的存储方式。

看看DecimalFormat用于控制双倍(或浮点数等)时如何显示数字。

请注意,选择BigDecimal超过双倍(反之亦然)具有优点/缺点,并且取决于您的要求。有关更多信息,请参阅here。从汇总:

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

1

如果使用System.out.printf(),你可以使用double和display。

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

.10f - 意味着10

相关问题