使用 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 为我们提供了正确的结果。