[C#] 소수점 처리 에러

2024. 1. 10. 20:44[C#]/[C# 윈폼] 혼자해보는 계산기 만들기

소수점을 입력하고 숫자를 입력하는데 1~9는 쳐지지만 0은 안쳐지는 버그가 발생했다.

예를 들면
1. 10.2456, 2.9812 이렇게는 가능한데
2. 10.02나 10.2931081 소수점 아래 0을 입력 시 소수점이 사라져서 10이 되거나 10.293181처럼  소수점 아래 0이 누락되는 버그였다.

 

아무리 찾아봐도 안보이고 혹시 자료형 문제인가.. 싶어서 자료형도 찾아보고 했는데 해답을 얻지 못해서 곰곰히 생각해보니 문제점을 발견했다.


천의 자리 숫자를 위한 포맷에서 해답을 찾았다.

//숫자 입력 처리
public void SetNum(string num)
{
    System.Diagnostics.Debug.WriteLine(NumScreen);

    if (isNewNum)
    {
        NumScreen.Text = num;
        isNewNum = false;
    }
    else if (NumScreen.Text == "0")
    {
        NumScreen.Text = num;
    }
    else
    {
        NumScreen.Text += num;
    }
    FormatNumber(); ===> 이 부분
}

 

  • 내가 천의 자리 수를 1,203 이런 식으로 표현해주고 싶어서 저 함수를 추가하고 저기서 에러가 발생했으리라는 꿈에도 몰랐다.
 private void FormatNumber()
 {
     double parsedNumber;
     if (double.TryParse(NumScreen.Text, out parsedNumber))
     {
         NumScreen.Text = parsedNumber.ToString("#,##0.#########");
     }
 }
  • 문제가 보이는가? => 화면에 있는 텍스트를 가져와서 double형으로 바꾸는 과정에서 0이 누락된 것이다.
  • 왜냐 0.130은 String으로는 0.130이라는 문자열이지만 double형에서는 0.13이 되버리는 것이었다.

 

private void FormatNumber()
{
    if (!string.IsNullOrEmpty(NumScreen.Text))
    {
        string[] parts = NumScreen.Text.Split('.'); //소수점으로 나눠서
        if (parts.Length == 2)
        {
            parts[1] = parts[1].PadRight(1, '0'); //0을 오른쪽에 한번 추가해준다.
            NumScreen.Text = $"{double.Parse(parts[0]):#,##0}.{parts[1]}";
        }
        else
        {
            NumScreen.Text = $"{double.Parse(NumScreen.Text):#,##0}";
        }
    }
}
  • 이렇게 함수를 변경해주니 소수점 입력이 잘되었다.

+ 역수를 수식칸에 포함해주는 기능도 완료했다.


 

계산기도 은근 깊게 들어가면 할 게 많은 것 같다.

 

내일은

1. 제곱, 제곱근 수식칸에 표시

2. 계산 정밀도 높히기를 할 생각이다 => 직접 테스트 해보니 소수점까지 계산하느라 제곱근을 계산하고 제곱을 하면 같은 숫자가 나와야하는데 12가 나와야 할 것이 11.999999이런 식으로 표시되서 다시 계산하면 오차가 발생했다.

 

 

반응형