哪种数据类型倾向于代表十进制数字,例如“10364055.81”。
如果尝试使用double:
double d = 10364055.81;
但是,当我尝试打印该数字时,它显示为“ 1.036405581E7 ”,这是我不想要的。
我应该使用BigDecimal吗?但其显示为 10364055.81000000052154064178466796875 。
是否有任何数据类型按原样显示值?同样,该数字可能大于示例中的数字。
BTW,将使用BigDecimal来影响应用程序的性能吗?我可能会在几乎所有的DTO中使用它。
最佳答案
您应该使用BigDecimal-但使用String构造函数,例如:
new BigDecimal("10364055.81");
如果将
double
传递给BigDecimal,则Java必须首先创建该double,并且由于double不能准确表示大多数十进制小数,因此它确实将值创建为10364055.81000000052154064178466796875
,然后将其传递给BigDecimal构造函数。在这种情况下,BigDecimal无法知道您实际上是指舍入器版本。一般来说,使用BigDecimal的非String构造函数应被视为警告,提示您没有充分利用该类的优点。
编辑-基于完全重读您想做的事情,我最初的主张可能过强。当您需要精确表示十进制值时,BigDecimal是一个不错的选择(例如,货币处理是显而易见的选择,例如,您不希望5.99 *一百万成为
5990016.45
。但是,如果您不担心数字会在内部存储为与输入的十进制文字略有不同的值,并且只想以相同的格式再次将其打印出来,那么就像其他人所说的,
NumberFormat
的实例(在这种情况下,new DecimalFormat("########.##")
)可以很好地输出double值,或者String.format可以做很多相同的事情。至于性能-BigDecimals自然会比使用基元慢。不过,通常情况下,除非程序中的绝大多数都涉及数学运算,否则您不太可能真正注意到任何速度差异。这并不是说您应该全部使用BigDecimals;但是,如果您可以从纯
doubles
很难或不可能实现的功能中获得真正的 yield ,那么就不要再冒理论上引入的微小性能差异了。