이 기사에서는이 문제의 근본 원인을 탐색하고 피하는 방법을 설명하고, 실현 가능한 예를 제공하며, 업데이트 된 Java 버전이 더 나은 대안 솔루션을 제공하는지 논의 할 것입니다.
1 Digit 기호의 경우 11 자리
인덱스에 사용되는 52 -Bit 점수 (꼬리 번호)에 사용됩니다.제한된 정확도 : Double은 최대 15-17 비트 10 진수 숫자 만 정확하게 나타낼 수 있습니다.
출력 :
를 비교하십시오 정확도 손실을 다루는 또 다른 방법은 플로팅 포인트의 수를 공차 (Epsilon)와 비교하는 것입니다. 이 방법은 정확한 동등한 특성에 따라 숫자가 "충분히 가까운 지 여부를 확인합니다.
Epsilon 비교를 사용하는 예 :<code class="language-java">public class DoublePrecisionLoss { public static void main(String[] args) { double num1 = 0.1; double num2 = 0.2; double sum = num1 + num2; System.out.println("预期和:0.3"); System.out.println("实际和:" + sum); // 比较 if (sum == 0.3) { System.out.println("和等于0.3"); } else { System.out.println("和不等于0.3"); } } }</code>
단순화 된 비교
: 정전.<code>预期和:0.3 实际和:0.30000000000000004 和不等于0.3</code>
요약
<code class="language-java">import java.math.BigDecimal;
public class BigDecimalExample {
public static void main(String[] args) {
BigDecimal num1 = new BigDecimal("0.1");
BigDecimal num2 = new BigDecimal("0.2");
BigDecimal sum = num1.add(num2);
System.out.println("预期和:0.3");
System.out.println("实际和:" + sum);
// 比较
if (sum.compareTo(new BigDecimal("0.3")) == 0) {
System.out.println("和等于0.3");
} else {
System.out.println("和不等于0.3");
}
}
}</code>
bigdecimal : bigdecimal은 정확성을 보장 할 수 있지만 재무 또는 중요한 계산의 성능에 영향을 줄 수 있습니다.
라이브러리 사용 : Apache Commons Math는 Precision.equals와 같은 실용적인 프로그램을 제공하며, 이는 플로팅 포인트 비교를 효과적으로 처리 할 수 있습니다.
위 내용은 double이 정밀도를 잃는 이유와 Java에서 이를 방지하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!