flooded 정수 구분 (예 : Python offers)을 C#으로 처리하는 것이 쉽고 효율적이며 (즉, 이중에서 /로 변환하지 않아야합니다.) 방법이 있습니까?플로팅 된 정수 나누기
즉, 장/이중 변환 손실이없는 다음의 효율적인 버전입니다.
(long)(Math.Floor((double) a/b))
또는 예를 들어,
static long FlooredIntDiv(long a, long b)
{
if (a < 0)
{
if (b > 0)
return (a - b + 1)/b;
// if (a == long.MinValue && b == -1) // see *) below
// throw new OverflowException();
}
else if (a > 0)
{
if (b < 0)
return (a - b - 1)/b;
}
return a/b;
}
*) 내 시스템에 던져 (않는 현실에서
OverflowException
가
unchecked
내부에서 발생
leaves it open 여부를 나누기 연산자)와
Visual Studio .NET 2003 version의 C# 4 사양은 심지어 던져 의무 있지만 :
왼쪽 피연산자가 가장 작은 int 또는 long 값을 나타내고 오른쪽 피연산자가 -1 인 경우 [..] System.OverflowException은이 상황에서 작업이 확인 된 컨텍스트 또는 확인되지 않은 컨텍스트에서 발생하는지 여부에 관계없이 항상 발생합니다.
편집
checked
및 unchecked
에 대한 그어 문이 아니라 모든 좋은,하지만 checked
만 compile time concept, 그래서 여부 제 기능을 주위에 포장해야 사실입니다 또는 함수를 호출하는 코드가 checked
안에 있는지 여부에 관계없이 어쨌든 내게 달려있다.
결과는'Math.Floor'에 결과를 전달하는 대신 사용할 수 있습니다. –
정수 부분은 문자 그대로 Math.Floor를 호출하지 않고 이미이를 수행하고 있지만 결과는 동일하며 소수 부분 만 잘라 버립니다. 이 경우 Math.Floor는 중복됩니다. –
@maremp : 긍정적 인 결과 만 나타냅니다. C#'/'연산자 구현과 다른 "floor"부정 결과의 예는 OP 표를 참조하십시오. –