728x90
반응형
SMALL

22일 23일은 내시경으로… 수면 마취가 안깨서 아무것도 할 수 없었다..!

계산기 프로그램을 나눗셈까지 하고 마무리 짓고 바로 새로온 책을 읽으면서 공부하려했지만… 생각보다.. 오래걸렸다…


3 나누기 0을 했더니 ∞무한이 나왔다..!

찾아보니 수학에서 나누기 연산을 수행할 때, 0으로 나눌 수 없는 이유가 명확하고 확실한 답이 없기 때문에 정의되지 않는 작업이라고 한다!!

DivNumbers_Click 함수에서 number2에 0을 입력하도록 허용하고 0으로 나누기를 방지하는 메커니즘이 없으면 프로그램에서 number1 / number2를 실행하려고 할 때 DivideByZeroException이 발생!

그래서 따로 나누기에 0에 대한 예외처리가 필요하다!

그럼 int로 제한하면 되지 않을까 싶었는데, 그것고 다시 고민해봐야할거같다!

if (float.TryParse(Div2.Text, out number2) == false || number2 == 0f)
   {
       MessageBox.Show("Div2에 잘못된 값이 들어왔습니다. 0이 아닌 숫자를 입력해주세요.");
       Div2.SelectAll();
       Div2.Focus();
       return;
    }

값이 float의 범위가 넘어가게 되면 잘못 들어왔다는 예외가 발생하길래

그럼 숫자의 범위를 지정해주자!

그런데 몇까지 제한을 하면 될까? 고민을 하던 중 검색을 해보았다

숫자를 제한하자~ 123456789012345678901234567890123456789/1000000000000000000000 몇까지 될려나?

float 보다 더큰 숫자의 범위를 가진 정수나 실수를 사용해야 float에 대한 최대 범위를 예외처리 할 수 있다..! 지금은 100까지만 하자..! (혼자 타협..하면 안되지… 어서 찾아!!)

float를 제한하고 싶으면 float 보다 더 큰 double을 이용해야한다!

if (float.TryParse(Div1.Text, out number1) == false || number1 < -100 || number1 > 100)
{
      MessageBox.Show("잘못된 값이 들어왔습니다. Div1 -100에서 100사이의 숫자를 입력해주세요.");
      Div1.SelectAll();
      Div1.Focus();
      return;
}
if (float.TryParse(Div2.Text, out number2) == false || number2 < -100 || number2 > 100)
{
      MessageBox.Show("잘못된 값이 들어왔습니다. Div2 -100에서 100사이의 숫자를 입력해주세요.");
      Div2.SelectAll();
      Div2.Focus();
      return;
}

오류 노트

오류 CS1503 1 인수: 'double'에서 'int'(으)로 변환할 수 없습니다. helloFrom C:\Users\feive\Desktop\study\codepractice\helloFrom\helloFrom\Calculator.cs 401 활성

// 나눗셈
        public int Div(int number1, int number2)
        {
            int div = number1 / number2;
            return div;
        }
        public float Div(float number1, float number2) 
        { 
            float div = number1 / number2;
            return div;
        }

// 이부분에서 따로 double을 만들어주지 않아 발생한 문제..!
				public double Div(double number1, double number2) 
        { 
            double div = number1 / number2;
            return div;        
        }
// 그런데 C#은 비슷한데 다른걸 추천해주었다..!
				public double Div(double number1, double number2) 
        { 
            double div = number1 / number2;
            return (doble)div;        
        }

오류 CS0161 'MulResult.Div(double, double)': 코드 경로 중 일부만 값을 반환합니다. helloFrom C:\Users\feive\Desktop\study\codepractice\helloFrom\helloFrom\Calculator.cs 457 활성

→ 제대로 완성하지 않아서 발생한 문제!


				public double Div(double number1, double number2) 
        { 
            double div = number1 / number2;
            return div;        
        }

				public double Div(double number1, double number2) 
        { 
            double div = number1 / number2;
            return (doble)div;        
        }

기능적으로 동일하게 동작에 차이가 없다. 둘 다 두 개의 double 부동 소수점 숫자에 대해 나눗셈 연산을 수행하고 결과를 double로 반환한다. 나눗셈 연산이 수행되고 결과가 div 변수에 저장되며, 이후에 그대로 반환 명시적 캐스팅에 대해 나오고 있는데, 명시적 캐스팅에 대해 알아보기! 명시적 캐스팅이 있을 경우 두 번째 방법을 사용하고, 없을 경우 첫 번째 방법을 사용한다. 왜 그런지 찾아보자!

명시적 캐스팅, 또는 타입 캐스팅

값을 한 데이터 타입에서 다른 데이터 타입으로 변환하는 방법이다. 컴파일러에게 특정 값을 원래의 타입과 다른 데이터 타입으로 취급하길 원하는 것을 명시적으로 알릴 수 있다. 이는 산술 연산을 수행하거나 서로 다른 타입의 변수에 값을 할당하는 경우에 데이터 타입의 호환성을 보장해야 할 때 유용하다.

컴파일과 컴파일러

프로그램 소스 코드를 컴퓨터 등 하드웨어가 실행할 수 있는 기계 코드로 변환하는 프로그램을 컴파일러라 하고, 변환하는 과정을 컴파일이라고 한다.

내일 명시적 캐스팅 또는 타입 캐스팅을 예로 들 수 있는 예시를 만들어보자!


사용해본 숫자 유형

  • int: -2,147,483,648 ~ 2,147,483,647(부호 있는 32비트 정수)
  • float: ±1.5 × 10^-45 ~ ±3.4 × 10^38, 약 7자리 정밀도(32비트)
  • double: ±5.0 × 10^-324 ~ ±1.7 × 10^308, 약 15 ~ 17자리 정밀도(64비트)

728x90
반응형
LIST

'일상 > TIL' 카테고리의 다른 글

07.26 학습내용  (0) 2023.07.26
07.25 학습내용  (0) 2023.07.25
07.21 학습내용  (0) 2023.07.21
07.20 학습내용  (0) 2023.07.21
07.19 학습 내용  (0) 2023.07.19
728x90
반응형
SMALL

계산기 프로그램 만들기 나눗셈

  • 0과 0f 의 차이점이  '0'과 '0f'는 '0'이 정수 리터럴이고 '0f'가 부동 소수점 리터럴 c#이 똑똑해서 0을 알아서 0f로 바꾸기 때문에 차이가 없다고 한다…

C#(및 기타 C 유사 언어)에서 '0'과 '0f'는 '0'이 정수 리터럴이고 '0f'가 부동 소수점 리터럴이라는 점에서 다르다

0을 사용하면 컴파일러는 정수로 인식!

0f를 사용하면 컴파일러는 float로 인식!

컴파일러는 암시적으로 정수 '0'을 float로 변환한다!

나누셈에서 정수 나누셈은 나머지를 자르기 때문에 f를 붙여야한다!!

float number1 = 0;
float number2 = 0;
결과 1/2 = 0

float number1 = 0f;
float number2 = 0f;
결과 1/2 = 0.5

부동의 소수점을 확실히 하기 위해 float 리터럴을 명시적으로 f를 사용하는 것이 좋다!


정수 리터럴

  • 정수 값을 나타내는 숫자
  • int(-2,147,483,648 ~ 2,147,483,647) 범위에 맞으면 'int'(부호 있는 32비트 정수)로 해석되고 그렇지 않으면 'long'(부호 있는 64비트 정수)으로 해석
int number = 100; // 100은 정수 리터럴
long number = 100L; // 리터럴이 long 유형이 되도록 지정

부동 소수점 리터럴

  • 코드에서 부동 소수점 값을 나타내는 숫자, 즉 소수 부분을 포함할 수 있는 숫자
  • 부동 소수점 리터럴은 기본적으로 double유형
double number = 3.14; // 3.14는 부동 소수점 리터럴
// float 의 경우 리터럴 추가해야함!
float number = 3.14f;

// double 의 경우 생략 가능! => 부동의 소수점 리터럴의 기본값이 double이기 때문!!
double number = 3.14;
double number = 3.14d;


리터럴 : 부호

중복 리터널 : 특별한 의미 없이 자체를 정의하는 데 사용하는 단어, 숫자, 부호(리터널)가 프로그램 상에서 두번 이상 사용되는 경우 (네이버 지식백과)

 

내일 해야할 것..! 근데.. 건강검진 받으러 간당.. 할수 있겠지..?ㅠㅠ 

int와 float 말고 다른 자료형 변수를 사용해보자!

int와 float의 값을 넘어가게 되면 문자가 들어왔다는 이름이 나오기에

이거 예외처리하기!

728x90
반응형
LIST

'일상 > TIL' 카테고리의 다른 글

07.25 학습내용  (0) 2023.07.25
07.24 학습내용  (0) 2023.07.25
07.20 학습내용  (0) 2023.07.21
07.19 학습 내용  (0) 2023.07.19
JVM과 메모리 구조  (0) 2023.06.05
728x90
반응형
SMALL

계산기 프로그램 만들기 곱셈

소수점 자리를 문자로 인식하는데, 이것은 어떻게 예외 처리를 할것인가!!

추가로 소수점을 문자로 인식하고 있어 어떻게 해결할 것이고, .을 하나만 추가했을때만 수락해야하며, .이 2개 들어왔을 때 어떻게 처리할 것인지 고민하기!

소수점이 적용이 되지 않은 것은! float를 선언하지 않아서!

// 실수
            float number1 = 0f;
            float number2 = 0f;

// 소수점을 문자로 인식하지 않게 하는 예외처리 어떻게 할 것인가..!!
            // number를 int로만 선언했기 때문에 소수점이 안되는 것 같다!
            if (float.TryParse(Mu1.Text, out number1) == false)
            {
                MessageBox.Show("Mu1에 문자가 들어왔습니다. 숫자를 입력해주세요.");
                Mu1.SelectAll();
                Mu1.Focus();
                return;
            }
            if (float.TryParse(Mu2.Text, out number2) == false)
            {
                MessageBox.Show("Mu2에 문자가 들어왔습니다. 숫자를 입력해주세요.");
                Mu2.SelectAll();
                Mu2.Focus();
                return;
            }
//int mu = Mu(number1, number2);
            float mu =Mu(number1, number2);
            MuResult.Text = Convert.ToString(mu);
            MuResult.Text = mu.ToString();

int와 float에 범위가 어디까지 인지 궁금해져서 찾아보았다!

• int: -2,147,483,648 ~ 2,147,483,647(부호 있는 32비트 정수)

• float: ±1.5 × 10^-45 ~ ±3.4 × 10^38, 약 7자리 정밀도(32비트)


C#의 일반적인 정수 유형과 해당 범위!!

  • byte: 0 ~ 255(부호 없는 8비트 정수)
  • sbyte: -128 ~ 127(부호 있는 8비트 정수)
  • short: -32,768 ~ 32,767(부호 있는 16비트 정수)
  • ushort: 0 ~ 65,535(부호 없는 16비트 정수)
  • int: -2,147,483,648 ~ 2,147,483,647(부호 있는 32비트 정수)
  • uint: 0 ~ 4,294,967,295(부호 없는 32비트 정수)
  • long: -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807(부호 있는 64비트 정수)
  • ulong: 0 ~ 18,446,744,073,709,551,615(부호 없는 64비트 정수)

C#의 일반적인 부동 소수점 범위!!

  • float: ±1.5 × 10^-45 ~ ±3.4 × 10^38, 약 7자리 정밀도(32비트)
  • double: ±5.0 × 10^-324 ~ ±1.7 × 10^308, 약 15 ~ 17자리 정밀도(64비트)
  • decimal: ±1.0 × 10^-28 ~ ±7.9 × 10^28, 28 ~ 29자리 정밀도(128비트)

부동 소수점이란?

부동 : 물이나 공기 중에 떠서 움직임, 고정되어 있지 않고 움직임 ex) 부동인구

(네이버 국어사전)

하나의 수를 고정 소수점 부분을 나타내는 부분과 고정 소수점 위치를 나타내는 부분으로 나누어 표기

  • 컴퓨터에서 실수를 나타내는 방법
  • 소수점이 주위에 부동 할 수 있다는 사실을 나타낸다.

고정 소수점 부분 : 부동 소수점 기수법에서 실수를 나타내는 부분.

부동 소수점 기수법에서는 하나의 수를 고정 소수점 부분과 지수 부분의 두 부분으로 나누어 표현

0.0001234을 부동 소수점 기수법으로 표현하면 0.1234^-3 (노션에서 지수를 표현하는걸 모르겠….ㅠ)

고정 소수점 0.1234 || 지수 -3

0.0001234 = 0.1234 * 10 ^ -3 으로 표현된다.



오류 노트

  • 어제 만든 계산기에서 덧셈과 뺄셈을 각각 계산하려고 했는데, 둘 다 넣어야 작동하는 것을 발견했다. ( 뺄셈의 숫자로 계산..!!
  • // 덧셈 만들기 if (String.IsNullOrWhiteSpace(Sub1.Text)) // 이렇게 된것을 발견!! 뺄셈을 만들고 수정이 제대로 안되서 발생한 문제! if (String.IsNullOrWhiteSpace(Sum1.Text))
  • 곱셈을 이벤트에 집어 넣어도 작동이 안하는 현상
    • 오타..!!
    • 결과를 입력하는 창을 만들지 않았다..!! 만들어 놓고 결과를 보여줄 곳에 입력하지 않았다..
    int mu = Mu(number1, number2);
                MuResult.Text = Convert.ToString(mu);
                MuResult.Text = mu.ToString();
    
  • int와 float를 둘다 사용해서 만들고 싶은데, 왜 안되는지에 대해 먼저 생각해 보다 float가 int의 범위를 포함하고 있어서 중복이 되기 때문에 적용이 되지 않은 것! (그래서 숫자의 범위를 찾아보았다!)
  • 실수를 사용해놓고 뒤에 표현을 제대로 안썼다..
    • 작동은 하는데, 제대로 표기를 하자!
    		float number1 = 0f;
        float number2 = 0f;
    
  • float number1 = 0; float number2 = 0;

오늘의 회고

느낀 점 및 배운점

  • 부동의 소수점이라는 단어가 전부터 왜 하필 부동이라는 단어를 사용할까 궁금했는데, 부동이라는 뜻이 부동인구를 생각하면 정해져 있지 않고 대략적으로 이동인구를 파악하는 부분을 생각하면 될거 같아 왜 단어를 그렇게 사용했는지 알게 된 거 같다.
  • 수의 범위를 계속 보면서 암기!!

개선 점 및 나아가야할 점

  • 그 전에 궁금해도 배울 양이 너무 많아서 왜? 라는 질문을 해도 찾아보고 이게 왜 이렇게 되는지 이해하는 시간이 부족했기 때문에 복습 차원에서 선택한 부분이 꼬리에 꼬리를 물고 공부를 하게 되는거 같다.
  • 맥북도 연습을 따로 하고 있긴 한데, 환경변수 될때까지 해보기로!! 내일 안에 환경변수 성공하면 주말에 맥북으로 복습을 한 번 더 할 수 있을 거 같다!
  • 0과 0f 의 차이점에 대해 읽고 있는데, 정리는 내일 할 수 있을 거 같다! '0'과 '0f'는 '0'이 정수 리터럴이고 '0f'가 부동 소수점 리터럴 c#이 똑똑해서 0을 알아서 0f로 바꾸기 때문에 차이가 없다고 한다…
728x90
반응형
LIST

'일상 > TIL' 카테고리의 다른 글

07.24 학습내용  (0) 2023.07.25
07.21 학습내용  (0) 2023.07.21
07.19 학습 내용  (0) 2023.07.19
JVM과 메모리 구조  (0) 2023.06.05
WOMEN WHO CODE Seoul  (0) 2023.06.03

+ Recent posts