본문 바로가기

Programming/JAVA/JSP

[Java] 소수점 계산하기

Java에서도 쓰지말라고 권유하는 기능이 있구나.
계산하는게 이따위면 어떻게 믿고 쓰겠냐.

진짜 누구 말마따나 자바 계산하는거 못믿으니까 DB에서 계산한 값을 리턴받게 해서 쓴다는게 이해가 된다.

아래는 소수점 계산하는 소스 예제다.
double tempT = ((double)notNullInteger(typeT[k]) / max_cnt) * 100;
double tempM = ((double)notNullInteger(typeM[k]) / max_cnt) * 100;
double tempW = ((double)notNullInteger(typeW[k]) / max_cnt) * 100;

결과는 다음과 같다.(대충 이런식)
-------------------------
0.613496932515337
0.613496932515337
100.0

이것도 문제가 있다.

2007-12-07 15:58:51.0  /  글번호 : 303774 category : Java Beginner  /  조회 : 542
자바에서 숫자를 나눌때 .. cm543
안녕하세요

double a = 40/100;
System.out.println(a);

결과값 : 0.0이 나옵니다. 


제가 원하는 값은 0.4인데 어떻게 해야 하나요? ^^
고수님의 조언 부탁드립니다.
  
2007-12-07 17:27:53.0  /  글번호 : 303775   
그냥 40/100을 하면 int형으로 인식하기때문에 wolfboy
값은 0이고 0을 double에 담았으므로 당연히 0.0이 나옵니다.

따라서 int형이 아닌 double 또는 float형으로 다뤄줘야하는데 방법은 여러가지가 있습니다.

40.0/100하시던지
40D/100 하시면 40이 double형이라는 의미이므로 당연히 0.4 나옵니다.

또는 

(double)40/100 이런식으로 40을 casting해주는 방법도 있습니다.

그럼 수고하세요.
  

이렇게 해결한다고 해도 또 문제는 있다.
궁금이
2008-12-03 11:32:00.0
소수점 계산시 오류

자바에서 소수점 계산시 오류에 관한 내용은 많이 검색해 봤는데요,

딱히 방법이 떠오르질 않아서 문의 드립니다.

 

double ld_mod = (aaa * 100) % 3;

 

위의 처럼 aaa를 입력 받아 3으로 나눈 다음 나머지가 0 이냐를 점검에서

(즉, 나누어서 떨어지냐...)

또 다른 계산을 하는 프로그램을 만들고 있습니다.

그런데, 계산이 이상하여 자세히 점검해 보니 아래처럼 결과과 나오네요.

--------------------------------------------------------------

double ld_mod1 = (2.01 * 100) % 3;
double ld_mod2 = 201 % 3;
double ld_mod3 = (2.01 * 100);

ld_mod1 = 2.9999999999999716
ld_mod2 = 0.0
ld_mod3 = 200.99999999999997

--------------------------------------------------------------

 

ld_mod1 의 값이 0.0으로 나오게 하는 방법이 없나요???

 

Tag
tag는 게시물의 성격을 나타내는 키워드를 입력하는 공간입니다.
tag는 login 후 사용하실 수 있습니다.
  • double 를 사용하시지 말고 BigDecimal 을 사용 하시면 될꺼 같습니다.
  • lahuman
  • 2008-12-03 11:27:05
  • x
  • 돈이나 통계비율 같이 정확한 계산이 필요한 곳에서 나누거나 곱할때에는 float이나 double은 사용하지 않는 것이 좋습니다.
    java뿐 아니라 javascript에서도 그러한 버그성 계산 나올수 있습니다.
    그것 때문에 제가 99년도 했던 어떤 프로젝트에서는 사칙연산할 때마다 db에서 했던적도 있습니다.-_-
    그리고 BigDecimal도 가급적 BigDecimal(String) 타입을 사용하세요.
  • 과객
  • 2008-12-03 11:41:11
  • x
  • 소수점 계산시 double을 사용하면 소수점 14자리 이하는 0.0000000000001의 오차를 낸다고 책에서 본적이 있는거 같네요..
    그래서 정확한 계산을 위해서는 BigDecimal을 사용하라고 권하고 있습니다..
  • mirpnj
  • 2008-12-03 12:29:32
  • x
  • 감사합니다. BigDecimal로 해결 했습니다.
  • 궁금이
  • 2008-12-03 14:32:25
  • x

주의하자.

아무리 자바라도 못믿는게 있다는걸 깨달았다.