C# 왜 등호가 포함이 안 될까요?
C#을 사용해 0.5부터 0.59까지 한 회당 0.01씩 증가하는 for 루프를 만들었는데 실행해 보면 결과에는 0.59가 아니라 0.58까지만 뜹니다. 전에 비슷한 코드 짰을 때는 잘 작동했는데 이번에 무엇을 잘못해서 등호가 생략되는 걸까요?
double sin, cos;
Console.WriteLine(" Angle Sine Cosine");
for (double start = 0.5; start <= 0.59; start += 0.01) //why does it exclude 0.59?
{
SineCosine(start, out sin, out cos);
Console.WriteLine($"{start,7:f}{sin,9:f4}{cos,9:f4}");
}
안녕하세요.
double의 정확도가 필요한 것이 아니라면, 현재 소수만으로는 float면 충분합니다.
아래와 같이 바꾸어 보시면 잘 동작하시는걸 확인하실수 있습니다.
for (float start = 0.5f; start <= 0.59f; start += 0.01f) //why does it exclude 0.59? {이 문제는 부동소수점 문제입니다
위 소스의 문제를 해결하는 방법은 아래와 같습니다
double sin, cos; Console.WriteLine(" Angle Sine Cosine"); for (decimal start = 0.50m; start <= 0.59m; start += 0.01m) //why does it exclude 0.59? { SineCosine(start, out sin, out cos); Console.WriteLine($"{start,7:f}{sin,9:f4}{cos,9:f4}"); }이렇게 decimal로 선언한후에 소수점 숫자뒤에 m 을 추가로 붙여줍니다
이렇게 하면 아래처럼 for 문이 0.59 까지 잘 처리됩니다
0.50 0.51 0.52 0.53 0.54 0.55 0.56 0.57 0.58 0.59안녕하세요~! 아하(Aha) 지식답변자 다라닝입니다.
질문하신 내용에 대하여 아래와 같이 답변 드립니다.
변수 특성상 그렇습니다.디버깅해보면 아시겠지만 0.56이 실제로는 0.5600000000005 이런식으로 찍힙니다.
이를 해결하려면 뒷자리를 잘라내거나 애초에 소수점자리를 지정하거나 조건을 수정하시면 될것같습니다.
부족하지만 도움이 되셨기를 바라며 추가적인 문의가 필요하시면 답변 부탁드려요!