2015-02-03 1 views
-1
더블

그래서 좀 계수 작업을하고 있었고, 난 내가자바 계수는

.3%.1 

을 수행 할 때 내가

0.09999999999999998 

대신 0 얻을 이유에 혼동되었다과 ... 어떻게 해결합니까 이? 당신이 시도 할 수

+0

0.3과 0.1 모두 부동 소수점 또는 이중으로 표현할 수 없습니다. –

+1

코드를 보지 않고는 도움을 드릴 수 없습니다. – Jens

답변

-1

- :

System.out.println((int)(.3%.1)); 

0o/p를 인쇄합니다.

이유는 부동 소수점 산술을 수행하기 때문에 결과가 부동 소수점 숫자입니다.

+0

이것은 질문에 대답하지 않습니다. OP는 부동 소수점 모듈러스를 원합니다. 너와 같은 결과를 int로 던지면 더 이상 올바르지 않을 것이다. 2.0 % 1.1 = 0.9이지만 int로 캐스팅하면 0이됩니다. 올바른 경우는 –

+0

입니다. 또한이 경우에는 운이 좋으면 0입니다. 0.1로 나누기위한 나머지는 ** 항상 **보다 작습니다. 0.1보다 작 으면 int로 캐스트 될 때 0이됩니다. 따라서 결과는 항상 0이고 모듈러스는 의미가 없습니다. 1보다 작은 숫자라도 같음 –

0

BigDecimal을 고려

변경이 불가능한, 임의 정밀도의 부호 첨부 소수입니다.

이렇게하면 값을 정확하게 나타낼 수 있습니다. floating point values is because they aren't exact으로 예상대로 작동하지 않는 이유입니다.

그래서 BigDecimal의 API를 사용하여

,

BigDecimal n1 = new BigDecimal("0.3"); 
BigDecimal n2 = new BigDecimal("0.1"); 
BigDecimal r = n1.remainder(n2); 
System.out.println(r); 

출력 :

0.0 
0

가장 가까운 이중 0.03 0.0299999999999999988897769753748434595763683319091796875과 0.01에 가장 가까운 두 배보다 약간 덜 뭔가를 감소 0.01000000000000000020816681711721685132943093776702880859375

입니다 0.03 모듈로 0.01보다 약간 큰 값은 반드시 값 sl가되어야합니다. 0.01 이하.

정확한 부동 소수점 표현이없는 숫자는 똑같이 약간 작거나 약간 큰 것으로 나타납니다. 잘 작동하지만 반올림을 사용하면 작은 차이가있는 값이 매우 다르게 처리되는 모듈러스를 비롯하여 바닥, 천장 및 이와 유사한 작업에서 불편한 결과를 초래할 수 있습니다.

이미 제안했듯이, 소수점 이하 부분의 정확한 처리가 특히 중요하면 BigDecimal 또는 10의 거듭 제곱으로 스케일을 사용하고 정수 산술을 수행하십시오. 그렇지 않으면, 모듈로 연산의 문맥 및 이유에 대한 자세한 정보를 제공하십시오.

관련 문제