很多人会建议使用BigDecimal,如果您不知道如何在项目中使用四舍五入,则应该这样做。如果您知道如何正确地使用十进制舍入,请使用double。它的速度快得多,更加清晰简单,因此在我看来容错率更低。如果您使用美元和美分(或需要两位小数),则可以获得高达70万亿美元的准确结果。基本上,只要使用适当的舍入进行纠正,就不会出现舍入误差。顺便说一句,许多开发人员听到舍入误差就感到恐惧,但它们并不是随机错误,您可以相对容易地管理它们。编辑:考虑以下简单示例的舍入误差。
double a = 100000000.01
double b = 100000000.09
System.out.println(a+b)
有许多可能的四舍五入策略。您可以在打印/显示时对结果进行四舍五入,例如:
System.out.printf("%.2f%n", a+b); // prints 200000000.10
或者在数学上对结果进行四舍五入。
double c = a + b;
double r= (double)((long)(c * 100 + 0.5))/100;
System.out.println(r);
在我的情况下,当从服务器发送(写入套接字和文件)时,我会对结果进行四舍五入,但使用自己的程序避免任何对象创建。
以下是更通用的四舍五入功能,但如果您可以使用 printf 或 DecimalFormat,则可能更简单。
private static long TENS[] = new long[19]; static {
TENS[0] = 1;
for (int i = 1; i < TENS.length; i++) TENS[i] = 10 * TENS[i - 1];
}
public static double round(double v, int precision) {
assert precision >= 0 && precision < TENS.length;
double unscaled = v * TENS[precision];
assert unscaled > Long.MIN_VALUE && unscaled < Long.MAX_VALUE;
long unscaledLong = (long) (unscaled + (v < 0 ? -0.5 : 0.5));
return (double) unscaledLong / TENS[precision];
}
注意:如果您需要特定的舍入方法,可以使用BigDecimal进行最终舍入。