float 및 double 관련 문제:
예 1:
달러 금액을 뺄 때 잘못된 계산:
System.out.println(1.03 - 0.42); // Resultado: 0.6100000000000001
예 2:
9개 항목을 각각 10센트에 구매할 때 오류 발생:
System.out.println(1.00 - 9 * 0.10); // Resultado: 0.09999999999999998
반올림해도 오류가 지속됩니다.
0.10~1.00의 증분 가격으로 과자를 구매할 때와 같이 점진적인 계산에 문제가 있습니다.
예 3:
더 이상 돈이 없을 때까지 과자를 구매할 때 오류가 발생했습니다.
double funds = 1.00; for (double price = 0.10; funds >= price; price = 0.10) { funds -= price; } System.out.println(funds); // Resultado: 0.3999999999999999
해결책 1: BigDecimal 사용
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
이제 계산이 정확해졌습니다.
BigDecimal의 단점:
해결책 2: int 또는 long 사용
int(센트)의 예:
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
계산이 빠르고 정확합니다.
결론:
선택사항:
부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.
Copyright© 2022 湘ICP备2022001581号-3