除非您有超过 15 个有效数字的精度,否则您不必使用 BigDecimal。您确实必须使用适当的舍入,这是 BigDecimal 可以帮助您解决的问题,但这并不意味着您不能对 double 做同样的事情。
double d = 0.0000000000012;
BigDecimal bd = BigDecimal.valueOf(d);
System.out.println("before d: " + d + " bd: " + bd);
d *= 1000000000000L;
d = Math.round(d * 1e2) / 1e2; // round to two places
bd = bd.multiply(BigDecimal.valueOf(1000000000000L));
System.out.println("after d: " + d + " bd: " + bd);
印刷
before d: 1.2E-12 bd: 1.2E-12
after d: 1.2 bd: 1.2000000000000
在性能方面,性能提高double
了BigDecimal
100 倍。BigDecimal 也会产生大量垃圾,而 double 不会产生任何垃圾。创建大量垃圾不仅速度很慢,而且会通过用垃圾填充 CPU 缓存来减慢所有其余代码的速度。
当我将它变成双精度以在我的方程中使用时如何避免失去精度。
使用 double 您需要自己跟踪精度。仅当您的函数不知道精度并且您无法告诉它们并且需要传递值时,这才是一个问题。即你没有机会四舍五入的答案。