728x90
728x170

친구가

double value1 = 0.01;
double value2 = 0.05;
double resultValue = value1 + value2;

위 결과가 이상하게 나온다고하여 확인해 보니

0.060000000000000005 으로 결과가 나왔다.;;

그래서 좀 찾아보니 어쩔수 없는.. 부동소수점은 근사치를 나타내는거라 정확하지 않다고 한다.

참고 http://www.sysnet.pe.kr/Default.aspx?mode=2&sub=0&detail=1&pageno=0&wid=10872&rssMode=1&wtype=0

 

위 결과를 제대로 나타내기 위해선 아래와 같이 두가지 방법이 있다.

1. decimal 자료형을 쓰는것이다. (C# 에서는 이방법을 추천)

decimal value1 = 0.01m;
decimal value2 = 0.05m;
decimal resultValue = value1 + value2;

 

원래 코드에 영향없이 하려면 아래 방법이 좋을것 같다.

double value1 = 0.01;
double value2 = 0.05;

decimal calValue1 = (decimal)value1;
decimal calValue2 = (decimal)value2;

double resultValue = (double)(calValue1 + calValue2);

 

2. double 형을 ToString() 해서 다시 double 로 변환을 해서 써도 된다.

double value1 = 0.01;
double value2 = 0.05;
double resultValue = Convert.ToDouble((value1 + value2).ToString());

추가로 다른 해결방법이 있을지는 모르겠다;

double/float 형으로 계산을 하는 경우는 주의를 해야할것 같다 자칫 잘못된 결과가 나올수 있기 때문이다.

C# 뿐만 아니라 모든 언어(IEEE 754따르는언어)에 해당된다고 한다.

 

참고

http://wiseheart-textcube.blogspot.kr/2006/07/c%EA%B3%BC-%EB%96%A0%EB%8B%A4%EB%8B%88%EB%8A%94-%EC%86%8C%EC%88%98%EC%A0%90-%EC%9D%B4%EC%95%BC%EA%B8%B03.html

https://stackoverflow.com/questions/8911440/strange-behavior-when-casting-a-float-to-int-in-c-sharp

728x90
그리드형
Posted by kjun.kr
,