Masalah apungan dan berganda:
Contoh 1:
Pengiraan yang salah semasa menolak jumlah dolar:
System.out.println(1.03 - 0.42); // Resultado: 0.6100000000000001
Contoh 2:
Ralat semasa membeli sembilan item dengan harga 10 sen setiap satu:
System.out.println(1.00 - 9 * 0.10); // Resultado: 0.09999999999999998
Walaupun pembundaran, ralat berterusan.
Masalah dengan pengiraan progresif, seperti semasa membeli gula-gula pada harga tambahan 0.10 hingga 1.00.
Contoh 3:
Silap-silap beli gula-gula sampai takde duit lagi:
double funds = 1.00; for (double price = 0.10; funds >= price; price += 0.10) { funds -= price; } System.out.println(funds); // Resultado: 0.3999999999999999
Penyelesaian 1: Gunakan BigDecimal
Contoh dengan BigDecimal:
BigDecimal funds = new BigDecimal("1.00"); BigDecimal price = new BigDecimal("0.10"); int itemsBought = 0; while (funds.compareTo(price) >= 0) { funds = funds.subtract(price); price = price.add(new BigDecimal("0.10")); itemsBought++; } System.out.println(itemsBought + " items bought. Money left: " + funds); // Resultado: 4 items bought. Money left: 0.00
Pengiraan kini tepat.
Kelemahan BigDecimal:
Penyelesaian 2: Gunakan int atau long
Contoh dengan int (dalam sen):
int funds = 100; // 1.00 dólar = 100 centavos int price = 10; // 0.10 dólar = 10 centavos int itemsBought = 0; while (funds >= price) { funds -= price; price += 10; itemsBought++; } System.out.println(itemsBought + " items bought. Money left: " + funds); // Resultado: 4 items bought. Money left: 0
Pengiraan adalah pantas dan tepat.
Kesimpulan:
Pilihan:
Atas ialah kandungan terperinci Perkara Elakkan terapung dan gandakan jika jawapan yang tepat diperlukan. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!