.net 区别于;Math.DivRem“;操作员呢?
.net 区别于;Math.DivRem“;操作员呢?,.net,math,operators,division,.net,Math,Operators,Division,System.Math.DivRem()与%运算符之间的区别是什么?%给出除法的余数并完全丢弃商,而DivRem()计算并返回商和余数 如果您只关心两个整数之间除法的余数,请使用%: int remainder = 10 % 3; Console.WriteLine(remainder); // 1 如果需要知道10除以3的次数,然后才能得到1的余数,请使用DivRem(),它返回商并将余数存储在out参数中: int quotient, remainder; quotient = Math.
System.Math.DivRem()
与%
运算符之间的区别是什么?%
给出除法的余数并完全丢弃商,而DivRem()
计算并返回商和余数
如果您只关心两个整数之间除法的余数,请使用%
:
int remainder = 10 % 3;
Console.WriteLine(remainder); // 1
如果需要知道10除以3的次数,然后才能得到1的余数,请使用DivRem()
,它返回商并将余数存储在out参数中:
int quotient, remainder;
quotient = Math.DivRem(10, 3, out remainder);
Console.WriteLine(quotient); // 3
Console.WriteLine(remainder); // 1
这是一种优化。一些处理器能够同时计算这两个值。其他处理器不能在硬件上划分(并且必须使用非常慢的软件例程) 在任何一种情况下(除非你有一个智能编译器),你都可以计算相同的除法两次。由于在任何处理器上(即使在硬件中实现时),除法都不会很快,因此使用Math.DivRem会给JIT一个很好的“提示”,让它只计算一次值 iirc Mono没有实现这种优化,我甚至不确定MS是否实现了。这可能是一种优化,但不幸的是,它产生的IL与division和mod操作相同 在典型的体系结构(x86和friends)上,这两者可以通过一个操作获得,但是.NETJIT似乎没有优化这一点(在我的测试中) 因此,以下两个是等效的:
quotient = Math.DivRem(10, 3, out remainder);
VS:
但后者更具可读性
请注意,在x86和x64上,此选项速度更快:
quotient = 10 / 3;
remainder = 10 - (3*quotient);
希望有一天JIT会改进,将两个操作优化为一个操作,因为它很简单。如果您只需要两个整数的商,您可以简单地使用
/
运算符而不是%
:整数商=10/3在VB.NET中,整数除法运算符是\:Dim商,即整数=10\3
。实际上,我可能使用Decimal.Divide(),因为我不希望返回一个完整的整数。@mbrownnyc re“我不希望返回一个完整的整数”:在除法之前,将其中一个或两个值转换为非整数类型:double result=a/(double)b代码>这是两个整数除法的非整数结果。感谢您解释底层过程。我用c#编写代码,显然使用的是.NET框架;但这是非常好的扩展。嘿我刚读完这篇:
quotient = 10 / 3;
remainder = 10 - (3*quotient);