질문:
두 가지 이중 유형의 값에서 작동을 수행 할 때 때로는 비정상적인 결과 값에 문제가 발생합니다. 예를 들어:
System.out.println (19.99+20); System.out.println (1.0-0.66); System.out.println (0.033*100); System.out.println (12.3/100);
산출:
39.98999999999999999995
0.3399999999999999999997
3.300000000000000003
0.123000000000000001
해결책:
Java의 단순한 부동 소수점 유형은 대부분의 경우 정상이기 때문에 작업을 수행 할 수 없지만 때로는 위에서 볼 수 있듯이 작업을 수행 할 수 없습니다. 이 문제는 실제로 컴퓨터 자체가 이진이기 때문에 실제로 Java의 버그가 아니며 플로팅 포인트 숫자는 실제로 대략적인 값에 불과합니다. 따라서 바이너리에서 소수점 부동 소수점 숫자로 변환하면 정확도가 쉽게 손실되어 정확도가 감소합니다.
정확성을 보장하려면 BigDecimal 클래스를 사용해야하며 Double에서 BigDecimal으로 직접 변환 할 수 없습니다. 두 배를 문자열로 변환 한 다음 bigdecimal으로 변환해야합니다. 즉, BigDecimal (Double Val) 방법을 사용할 수 없으며 효과가 없다는 것을 알 수 있습니다. bigdecimal (String val) 메소드를 사용합니다. 구체적인 예는 다음과 같습니다.
이중 유형의 4 가지 작업 예 :
1. 추가
public static double add (double a1, double b1) {bigdecimal a2 = new bigdecimal (double.tostring (a1)); bigdecimal b2 = 새로운 bigdecimal (double.tostring (b1)); return a2.add (b2) .doublevalue (); }2. 뺄셈
공개 정적 이중 서브 (Double A1, Double B1) {Bigdecimal A2 = New BigDecimal (Double.toString (A1)); bigdecimal b2 = 새로운 bigdecimal (double.tostring (b1)); return a2.subtract (b2) .doublevalue (); }3. 곱하십시오
공개 정적 이중 MUL (Double A1, Double B1) {Bigdecimal A2 = New BigDecimal (Double.tostring (A1)); bigdecimal b2 = 새로운 bigdecimal (double.tostring (b1)); a2.multiply (b2) .doublevalue (); }4. 분해
public static double div (double a1, double b1, int scale) {if (scale <0) {새로운 불법 불법 행위 ( "오류"); } bigdecimal a2 = 새로운 bigdecimal (double.tostring (a1)); bigdecimal b2 = 새로운 bigdecimal (double.tostring (b1)); return a2.divide (b2, scale, bigdecimal.round_half_up) .doublevalue (); }스케일 매개 변수가 불완전한 것으로 나누어지면 정확도를 지정하십시오.
Java에서 이중 유형의 비정상 작동 결과에 대한 해결책은 내가 공유하는 모든 콘텐츠입니다. 나는 당신이 당신에게 참조를 줄 수 있기를 바랍니다. 그리고 당신이 wulin.com을 더 지원할 수 있기를 바랍니다.