>  기사  >  Java  >  항목 정확한 답변이 필요한 경우 float 및 double을 피하세요.

항목 정확한 답변이 필요한 경우 float 및 double을 피하세요.

Barbara Streisand
Barbara Streisand원래의
2024-10-10 08:08:29844검색

Item  Evite o float e o double caso sejam necessárias respostas exatas

float 및 double 문제:

  • 과학 및 수학적 계산을 위해 설계되었으며 이진 부동 소수점 연산을 수행합니다.
  • 금전적인 계산이나 정확한 답변이 필요한 상황에는 적합하지 않습니다.
  • 0.1과 같은 10의 거듭제곱을 정확하게 표현할 수 없어 오류가 발생합니다.

예 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의 이중 생성자를 사용하지 말고 String 생성자를 선호하세요.

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 사용

  • 정확도 문제를 방지하려면 double이 있는 달러 대신 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

계산이 빠르고 정확합니다.

결론:

  • 정확한 정밀도가 필요한 계산에는 float 또는 double을 사용하지 마세요.
  • 금전적 계산이나 소수 정밀도가 필요한 상황에는 BigDecimal을 사용하세요.
  • 큰 숫자가 포함되지 않은 재무 계산에는 int 또는 long을 사용하여 센트 단위로 계산합니다.

선택:

  • 9자리까지는 정수를 사용하세요.
  • 최대 18자리까지는 긴 문자를 사용하세요.
  • 더 많은 수량을 원할 경우 BigDecimal을 사용하세요.
  • 이 요약은 상황에 따라 BigDecimal, int 또는 long 중에서 선택하면 정밀도와 성능을 모두 최적화할 수 있음을 보여줍니다.

위 내용은 항목 정확한 답변이 필요한 경우 float 및 double을 피하세요.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.