C #의 정수 나누기가 왜 실수가 아닌 정수를 반환합니까?
C #의 정수 나누기가 왜 실수가 아닌 정수를 반환하는지 아는 사람이 있습니까? 그 뒤에 아이디어는 무엇입니까? (C / C ++의 유산입니까?)
C #에서 :
float x = 13 / 4;
//imagine I used have an overridden == operator here to use epsilon compare
if (x == 3.0)
print 'Hello world';
이 코드의 결과는 다음과 같습니다.
'Hello world'
엄밀히 말하면 정수 나누기와 같은 것은 없습니다 (정의로 나누는 것은 합리적인 수를 생성하는 연산이며, 정수는 매우 작은 하위 집합입니다).
새로운 프로그래머가 실제로 부동 소수점 나누기를 사용하려고 할 때 정수 나누기를 수행하는 실수를 저지르는 것이 일반적이지만 실제로는 정수 나누기가 매우 일반적인 작업입니다. 사람들이 거의 사용하지 않는다고 가정하고 나누기를 할 때마다 항상 부동 소수점으로 캐스팅해야한다는 것을 알고 있다면 실수입니다.
먼저 정수 나누기가 훨씬 빠르므로 정수 결과 만 필요한 경우 더 효율적인 알고리즘을 사용하려고합니다.
둘째, 정수 나누기를 사용하는 많은 알고리즘이 있으며 나누기 결과가 항상 부동 소수점 수인 경우 매번 결과를 반올림해야합니다. 내 머리 꼭대기의 한 예는 숫자의 밑을 바꾸는 것입니다. 각 자릿수를 계산하려면 숫자의 부동 소수점 나누기보다는 숫자의 정수 나누기와 나머지를 나눕니다.
이러한 (및 기타 관련) 이유로 인해 정수 나누기는 정수가됩니다. 두 정수의 부동 소수점 나누기를 얻으려면 하나를 double
/ float
/ 로 캐스팅해야합니다 decimal
.
C # 사양을 참조하십시오 . 나누기 연산자에는 세 가지 유형이 있습니다
- 정수 나누기
- 부동 소수점 나누기
- 십진수 나누기
귀하의 경우 다음 규칙이 적용되는 정수 부서가 있습니다.
나누기는 결과를 0으로 반올림하고 결과의 절대 값은 두 피연산자의 몫의 절대 값보다 작은 가능한 가장 큰 정수입니다. 두 피연산자가 동일한 부호를 갖는 경우 결과는 0 또는 양수이고 두 피연산자가 반대 부호를 갖는 경우 결과는 0 또는 음수입니다.
C #이 정수 (일부 언어는 부동 결과를 반환)에 이러한 유형의 나누기를 사용하는 이유는 하드웨어입니다. 정수 나누기가 더 빠르고 간단합니다.
각 데이터 유형은 각 연산자를 오버로드 할 수 있습니다. 분자와 분모가 모두 정수인 경우 정수 유형은 나누기 연산을 수행하고 정수 유형을 리턴합니다. 부동 소수점 나누기를 원하는 경우 하나 이상의 숫자를 부동 소수점 유형으로 캐스팅 한 다음 나누십시오. 예를 들어 :
int x = 13;
int y = 4;
float x = (float)y / (float)z;
또는 리터럴을 사용하는 경우 :
float x = 13f / 4f;
부동 소수점은 정확하지 않습니다. 정밀도에 관심이 있다면 십진법과 같은 것을 사용하십시오.
당신이 어떤 접미사를 사용하지 않기 때문에, 리터럴 13
과는 4
정수로 해석됩니다 :
수동 :
리터럴 접미사가없는 경우, 그것의 값이 표현 될 수있는 이러한 유형의 첫 번째가 :
int
,uint
,long
,ulong
.
따라서 13
정수로 선언 하므로 정수 나누기가 수행됩니다.
수동 :
x / y 형식의 연산의 경우 이진 연산자 과부하 해결이 적용되어 특정 연산자 구현을 선택합니다. 피연산자는 선택한 연산자의 매개 변수 유형으로 변환되며 결과 유형은 연산자의 리턴 유형입니다.
사전 정의 된 부서 연산자는 다음과 같습니다. 연산자는 모두 x와 y의 몫을 계산합니다.
정수 나누기 :
int operator /(int x, int y); uint operator /(uint x, uint y); long operator /(long x, long y); ulong operator /(ulong x, ulong y);
그리고 반올림이 발생합니다.
나누기는 결과를 0으로 반올림하고 결과의 절대 값은 두 피연산자의 몫의 절대 값보다 작은 가능한 가장 큰 정수입니다. 두 피연산자가 동일한 부호를 갖는 경우 결과는 0 또는 양수이고 두 피연산자가 반대 부호를 갖는 경우 결과는 0 또는 음수입니다.
다음을 수행하는 경우 :
int x = 13f / 4f;
부동 소수점 나누기 (의 /
연산자 13f
)는 부동 소수점을 초래하므로 암시 적으로 int로 캐스트 할 수 없으므로 컴파일러 오류가 발생 합니다.
나누기가 부동 소수점 나누기가 되려면 결과를 부동 소수점으로 만들어야합니다.
float x = 13 / 4;
여전히 정수를 나눌 것입니다.이 정수는 내재적으로 부동으로 캐스팅됩니다 3.0
. 결과는입니다 . f
접미사 ( 13f
, 4f
)를 사용하여 피연산자를 float로 명시 적으로 선언합니다 .
그것은 단지 기본적인 작업 입니다.
나누는 법을 기억하십시오. 처음에 우리는 해결했다 9/6 = 1 with remainder 3
.
9 / 6 == 1 //true
9 % 6 == 3 // true
/ 연산자와 % 연산자를 조합하여 해당 값을 검색합니다.
유용 할 수 있습니다.
double a = 5.0/2.0;
Console.WriteLine (a); // 2.5
double b = 5/2;
Console.WriteLine (b); // 2
int c = 5/2;
Console.WriteLine (c); // 2
double d = 5f/2f;
Console.WriteLine (d); // 2.5
The result will always be of type that has the greater range of the numerator and the denominator. The exceptions are byte and short, which produce int (Int32).
var a = (byte)5 / (byte)2; // 2 (Int32)
var b = (short)5 / (byte)2; // 2 (Int32)
var c = 5 / 2; // 2 (Int32)
var d = 5 / 2U; // 2 (UInt32)
var e = 5L / 2U; // 2 (Int64)
var f = 5L / 2UL; // 2 (UInt64)
var g = 5F / 2UL; // 2.5 (Single/float)
var h = 5F / 2D; // 2.5 (Double)
var i = 5.0 / 2F; // 2.5 (Double)
var j = 5M / 2; // 2.5 (Decimal)
var k = 5M / 2F; // Not allowed
There is no implicit conversion between floating-point types and the decimal type, so division between them is not allowed. You have to explicitly cast and decide which one you want (Decimal has more precision and a smaller range compared to floating-point types).
'Programing' 카테고리의 다른 글
이름을 모르는 경우 Javascript 객체의 속성에 어떻게 액세스합니까? (0) | 2020.07.17 |
---|---|
CSS에서 이미지 위에 텍스트를 배치하는 방법 (0) | 2020.07.17 |
메모리 누수가 얼마나 멀리 갈 수 있습니까? (0) | 2020.07.17 |
Java에서 클래스 내부의 열거 형 유형은 정적입니까? (0) | 2020.07.17 |
http get 요청에서 헤더를 설정하는 방법은 무엇입니까? (0) | 2020.07.17 |