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