数据类型表示java中的大小数

时间:2009-10-22 09:00:40

标签: java bigdecimal jdk1.4

哪种数据类型易于表示十进制数,如“10364055.81”。

如果尝试使用double:

double d = 10364055.81;

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

我应该使用BigDecimal吗?但它显示为 10364055.81000000052154064178466796875 。 是否有任何数据类型显示值?此数字也可能大于例如。

BTW,会不会使用BigDecimal效果应用程序的性能?我可能会在几乎所有的DTO中使用它。

4 个答案:

答案 0 :(得分:17)

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

new BigDecimal("10364055.81");

如果将double传递给BigDecimal,Java必须首先创建双倍 - 并且因为双精度不能准确地表示大多数小数部分,所以 将值创建为10364055.81000000052154064178466796875然后然后将它传递给BigDecimal构造函数。在这种情况下,BigDecimal无法知道您实际上是指更圆的版本。

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

编辑 - 基于重新读取您想要做的事情,我的初步声明可能过于强烈。当您需要准确表示十进制值时,BigDecimal是一个不错的选择(货币处理是明显的选择,例如,您不希望5.99 *一百万为5990016.45

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

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

答案 1 :(得分:3)

如何显示数字 distinct 与数字的存储方式不同。

看看DecimalFormat,了解如何在双重(或浮动等)时显示数字。

请注意,选择BigDecimal over double(反之亦然)有利有弊,并且取决于您的要求。有关详细信息,请参阅here。摘要摘要:

  

总之,如果原始性能和   空间是最重要的因素,   原始浮点类型   适当。如果十进制值需要   准确,高精度   需要计算,或精细控制   仅需要舍入   BigDecimal有必要的   能力。

答案 2 :(得分:1)

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

答案 3 :(得分:1)

你可以使用double并使用System.out.printf()显示if。

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

.10f - 表示精度为10

的双精度型