나는 최근에 Java의 부동 소수점 계산 문제를 연구하고, 인터넷에서 관련 정보를 쿼리하고, 요약하고, 몇 가지 정렬 및 디버깅을 거쳐 마침내 이 기사를 완성했습니다.
Java에서 float로 선언된 변수는 단정밀도 부동 소수점 숫자이고, double로 선언된 변수는 이름에서 알 수 있듯이 배정밀도 부동 소수점 숫자입니다. float는 4바이트이고 double은 8바이트입니다. float 및 double 유형의 데이터는 계산 결과를 정확하게 나타낼 수 없습니다. 이는 float 및 double이 부정확한 계산이기 때문입니다. 다음 코드를 통해 이를 확인할 수 있습니다.
다음과 같이 코드 코드를 복사합니다.
공개 수업 테스트
{
공개 정적 무효 메인(문자열[] 인수)
{
System.out.println(0.05 + 0.01);
System.out.println(1.0 - 0.42);
System.out.println(4.015 * 100);
System.out.println(123.3 / 100);
}
}
실행 결과는 다음과 같습니다.
0.060000000000000005
0.5800000000000001
401.49999999999994
1.23299999999999999
원하는 효과를 얻으려면 java.text.DecimalFormat을 사용하여 부동 소수점 숫자의 형식을 지정할 수 있습니다.
DecimalFormat은 특정 형식에 따라 숫자의 형식을 지정할 수 있습니다. 일반적으로 사용되는 형식 지정 문자는 #, 0 등입니다. 예:
다음과 같이 코드 코드를 복사합니다.
System.out.println(new java.text.DecimalFormat("0.00").format(3.125));
System.out.println(new java.text.DecimalFormat("0.00").format(3.135));
그러나 결과는 다음과 같습니다.
3.12
3.14
이는 DecimalFormat이 반 짝수 반올림(ROUND_HALF_EVEN)을 사용하기 때문입니다. 간단히 말해서 5로 반올림할 때 가장 가까운 짝수를 사용하기 때문입니다. 따라서 DecimalForamt를 사용하면 신뢰할 수 있는 부동 소수점 숫자를 얻을 수 없습니다. 마지막으로 보다 정확한 계산을 위해 BigDecimal 사용을 고려할 수 있습니다.
BigDecimal은 부동 소수점 숫자와 관련된 여러 생성자를 제공합니다.
다음과 같이 코드 코드를 복사합니다.
BigDecimal(double val) double을 BigDecimal로 변환합니다.
BigDecimal(String val) BigDecimal의 문자열 표현을 BigDecimal로 변환합니다.
그러나 이중 매개변수를 사용하여 객체를 생성하면 값이 정확하지 않게 됩니다. 문자열을 통해서만 객체를 생성하는 것이 가장 정확합니다.
예를 들어:
다음과 같이 코드 코드를 복사합니다.
BigDecimal bd1=new BigDecimal(0.05);
System.out.println(bd1.toString());
BigDecimal bd2=new BigDecimal("0.05");
System.out.println(bd2.toString());
결과를 얻으십시오:
0.05000000000000000277555756156289135105907917022705078125
0.05
따라서 궁극적으로 String을 사용하여 객체를 생성해야 결과가 가장 정확해집니다. 또한, 이중 숫자인 경우 BigDecimal.valueOf(double val)도 사용할 수 있습니다. 이유는 매우 간단합니다. JDK 소스 코드는 다음과 같습니다.
다음과 같이 코드 코드를 복사합니다.
공개 정적 BigDecimal 값(이중 값)
{
return new BigDecimal(Double.toString(val));
}
마지막으로 주목해야 할 점은 BigDecimal의 덧셈, 뺄셈, 곱셈 및 나눗셈은 실제로 새로운 BigDecimal 개체를 반환한다는 것입니다. BigDecimal은 변경할 수 없으므로 각 작업 중에 새 개체가 생성되므로 .add(b); a는 추가 작업 후 값을 저장하지 않습니다. 올바른 사용법은 a=a.add(b)입니다.