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

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

如果尝试使用double:

double d = 10364055.81; 

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

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

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

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

 new BigDecimal("10364055.81"); 

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

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

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

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

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

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

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

请注意,选择BigDecimal over double(反之亦然)具有优点/缺点,并且将取决于您的要求。 有关详细信息,请参见此处 从摘要:

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

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

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

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

.10f – 表示精度为10的双精度型