"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > 항목 정확한 답변이 필요한 경우 float 및 double을 피하세요.

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

2024-11-06에 게시됨
검색:884

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 중에서 선택하면 정밀도와 성능을 모두 최적화할 수 있음을 보여줍니다.
릴리스 선언문 이 기사는 https://dev.to/giselecoder/item-60-evite-o-float-e-o-double-caso-sejam-necessarias-respostas-exatas-3mep?1에서 복제됩니다.1 침해가 있는 경우, 문의 Study_golang@163 .comdelete
최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3