자바

2011-04-05 3 views
4

두 복식의 나머지를 계산 다음 코드 한 : 나는 = 내가 나머지를 얻을 0.09999999999999906자바

어떤 생각이 왜이

Double x = 17.0; 
Double y = 0.1; 

double remainder = x.doubleValue() % y.doubleValue(); 

을 실행하면?

기본적으로 x가 y로 완전히 나눌 수 있는지 확인해야합니다. 자바에서 그렇게 할 수있는 대체 방법을 제안 할 수 있습니까?

감사합니다.

+1

는 실수 연산의 근사치입니다 : http://en.wikipedia.org/wiki/Floating_point#Accuracy_problems이 올바른입니다 – LumpN

답변

10

부동 소수점 숫자가 표현되는 이유 때문입니다. 그 int 캐스팅 (10) (100, 1000)에 의해 각각의 값은 여러이다에에

BigDecimal remainder = BigDecimal.valueOf(x).remainder(BigDecimal.valueOf(y)); 

또 다른 방법은 다음 %를 사용하면 정확한 값을 원하는 경우에

, BigDecimal를 사용합니다.

3

반올림 오류를 허용하는 결과를 비교해야합니다. 당신이 당신을 도움이 될 것입니다 double

+0

데이터가 실수로 float/double 소스에서 왔을 때 (그리고 부동 소수점 값으로 위장한 불연속적인 데이터가 아닌) 사용할 때의 응답이며,'x'가'y의 정확한 배수에 "매우 가깝다"는 것을 알고 싶습니다 '. –

1

This 포스트를 사용하는 것을 의미하는 경우도

if (remainder < ERROR || remainder > 0.1 - ERROR) 

는 더블을 사용하지 마십시오. 왜이 동작을 보는지, 그리고 BigDecimal 클래스에 대해서도 설명합니다.

+0

OP와 가장 중요한 관계가있는 부분을 최소한 인용해야합니다. 그렇지 않으면 당신은 그 문제에 많은주의를 기울이지 않은 것처럼 들립니다. –

1

이중 산술에서 정확한 결과를 기대하는 것은 컴퓨터에서 문제가됩니다. 기본적인 범죄자는 우리 인간이 기저 10을 주로 사용하는 반면, 컴퓨터는 기저 2에 보통 숫자를 저장한다는 것입니다. 두 사람 사이에 변환 문제가 있습니다.

이 코드는 당신이 원하는 것을 할 것입니다 : 소수점 연산 부동

public static void main(String[] args) { 
    BigDecimal x = BigDecimal.valueOf(17.0); 
    BigDecimal y = BigDecimal.valueOf(0.1); 

    BigDecimal remainder = x.remainder(y); 
    System.out.println("remainder = " + remainder); 

    final boolean divisible = remainder.equals(BigDecimal.valueOf(0.0)); 
    System.out.println("divisible = " + divisible); 

} 
+1

그냥 보완 : 가독성을 위해'valueOf (0.0) '대신'BigDecimal.ZERO'를 사용할 수 있습니다. 'valueOf (double)'여전히 정밀도/반올림 오류에 노출되어 있으므로 가능한 경우 new BigDecimal (String) 생성자를 사용하십시오. –