您应该使用 BigDecimal - 但使用 String 构造函数,例如:
new BigDecimal("10364055.81");
如果将 a 传递double
给 BigDecimal,Java 必须首先创建该双精度 - 由于双精度无法准确表示大多数小数,它确实创建了值 as10364055.81000000052154064178466796875
然后将其传递给 BigDecimal 构造函数。在这种情况下,BigDecimal 无法知道您实际上是指更圆的版本。
一般来说,使用 BigDecimal 的非 String 构造函数应该被视为一个警告,即您没有获得该类的全部好处。
编辑-基于重新阅读您想要做的事情,我最初的主张可能太强了。当您需要精确表示十进制值时,BigDecimal 是一个不错的选择(金钱处理是显而易见的选择,例如,您不希望 5.99 * 一百万5990016.45
。
但是,如果您不担心数字在内部存储为与您输入的十进制文字略有不同的值,并且只想以相同的格式再次打印出来,那么正如其他人所说,NumberFormat
(在在这种情况下,new DecimalFormat("########.##")
) 可以很好地输出双精度,或者String.format可以做同样的事情。
至于性能 - BigDecimals 自然会比使用原语慢。但是,通常情况下,除非您的程序的绝大多数都涉及数学运算,否则您实际上不太可能注意到任何速度差异。这并不是说您应该全部使用 BigDecimals。相反,如果您可以从它们的功能中获得真正的好处,而这些功能使用 plain 很难或不可能实现doubles
,那么不要担心它们理论上引入的微小性能差异。