double 값을 구할 때는 반드시 피연산자를 double로 형변환!
C++로 먼저 알아볼까요? ^^
double t = 1.0f / 3;
printf("%0.15Lf\n", t);
float 32비트 단정도 실수를 정수형 변수로 나누고 그 결과는 double에 담기기 때문에 왠지 배정도 실수로 연산이 될 듯하지만... 의외로 결과는 "0.333333343267441"로 나옵니다. 짐작할 수 있겠지만, 다음과 같이 (double)로 식을 강제로 형 변환해도,
double t2 = (double)(1.0f / 3);
printf("%0.15Lf\n", t2);
역시나 결과는 "0.333333343267441"로 나옵니다.
정확히 하려면, 피연산자 중 하나는 반드시 double로 처리해야 합니다.
double t3 = 1.0L / 3; // 1.0을 명시적으로 double literal로 처리.
printf("%0.15Lf\n", t3); // 출력 결과: 0.333333333333333
double t4 = 1.0f / (double)3; // 3을 명시적으로 double로 형변환
printf("%0.15Lf\n", t4); // 출력 결과: 0.333333333333333
아니면, 그냥 1.0이라고만 하면 C++ 컴파일러가 실수형 상수에 대해 기본적으로 double로 처리하기 때문에 정확한 결과가 나옵니다.
double t5 = 1.0 / 3;
printf("%0.15Lf\n", t5); // 출력 결과: 0.333333333333333
이것은 C#에서도 동일하게 적용됩니다. 피연산자 중에 double 형이 없다면 다음과 같이 단정도 실수의 정확성만 갖게 됩니다.
double t = 1.0F / 3;
Console.WriteLine(t); // 0.333333343267441
double t2 = (double)(1.0F / 3);
Console.WriteLine(t2); // 0.333333343267441
정확한 결과를 내려면 피연산자 중 적어도 하나는 double 형이거나,
double t3 = 1.0d / 3;
Console.WriteLine(t3); // 0.333333333333333
double t4 = 1.0F / (double)3;
Console.WriteLine(t4); // 0.333333333333333
C++에서와 마찬가지로 그냥 C# 컴파일러가 알아서 1.0을 double로 처리하도록 두면 됩니다.
double t5 = 1.0 / 3;
Console.WriteLine(t5); // 0.333333333333333
[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]