使用 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 為我們提供了正確的結果。