有一种简单的,有效的和正确的(即不涉及转换到/从双)的方式做地板整数除法(像例如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
leaves it open是否里面
unchecked
提出,在现实中它确实在我的系统上掷()和
Visual Studio .NET 2003 version的C#4规范甚至规定扔:
如果左操作数是最小的可表示的int或long值并且右操作数是-1,则无论操作是在检查的还是在未检查的上下文中发生,[..] System.OverflowException总是在此情况下抛出。
编辑
约checked
和unchecked
的划掉报表都不错,很好,但checked
实际上只是一个compile time concept,所以不管我的功能应环绕不管调用函数的代码是否在checked
之内,或者无论如何抛出都取决于我。
你的意思是,将结果传递给'Math.Floor'的替代方法? – 2015-01-21 04:38:03
整数除法已经在做这个,不是直接调用'Math.Floor',而是结果是一样的,它切断了整个小数部分。在这种情况下'Math.Floor'是多余的。 – 2015-01-21 04:39:37
@maremp:只有积极的结果。有关与C#'/'运算符实现不同的“底层”否定结果的示例,请参阅OP的表。 – 2015-01-21 04:40:25