使用 BigDecimal 而不是 float
由于浮点类型在计算机内存中的表示方式,使用此类型的操作结果可能不准确 - 某些值存储为近似值。这方面的好例子是货币计算。如果需要高精度,则应使用其他类型。例如 Java 7 提供 BigDecimal。
import java.math.BigDecimal;
public class FloatTest {
public static void main(String[] args) {
float accountBalance = 10000.00f;
System.out.println("Operations using float:");
System.out.println("1000 operations for 1.99");
for(int i = 0; i<1000; i++){
accountBalance -= 1.99f;
}
System.out.println(String.format("Account balance after float operations: %f", accountBalance));
BigDecimal accountBalanceTwo = new BigDecimal("10000.00");
System.out.println("Operations using BigDecimal:");
System.out.println("1000 operations for 1.99");
BigDecimal operation = new BigDecimal("1.99");
for(int i = 0; i<1000; i++){
accountBalanceTwo = accountBalanceTwo.subtract(operation);
}
System.out.println(String.format("Account balance after BigDecimal operations: %f", accountBalanceTwo));
}
该计划的输出是:
Operations using float:
1000 operations for 1.99
Account balance after float operations: 8009,765625
Operations using BigDecimal:
1000 operations for 1.99
Account balance after BigDecimal operations: 8010,000000
对于起始余额 10000.00,在 1.99 的 1000 次操作之后,我们预计余额为 8010.00。使用浮点型给出了大约 8009.77 的答案,这在货币计算的情况下是不可接受的。使用 BigDecimal 为我们提供了正确的结果。