C #의 정수 나누기가 왜 실수가 아닌 정수를 반환하는지 아는 사람이 있습니까? 그 뒤에 아이디어는 무엇입니까? (C / C ++의 유산입니까?)
C #에서 :
float x = 13 / 4;
//== operator is overridden 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;
여전히 정수를 나눌 것입니다.이 정수는 내재적으로 float로 캐스팅됩니다 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
답변
결과는 항상 분자와 분모의 범위가 더 큰 유형입니다. int (Int32)를 생성하는 byte 및 short는 예외입니다.
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
부동 소수점 유형과 10 진수 유형 간에는 암시 적 변환이 없으므로 이들을 구분할 수 없습니다. 원하는 것을 명시 적으로 캐스팅하고 결정해야합니다 (소수점은 부동 소수점 유형에 비해 정밀도가 높고 범위가 작습니다).
