浮点数类型如何进行模运算?

13

我正在尝试在浮点数据类型上执行简单的模运算。

float a=3.14f;
float b=10f;
result=a%b;

我得到的结果为3.14

另一个例子使用十进制数据类型:

decimal p=10;
decimal q=40;
result=p%q;

得到答案=20。

我不明白模运算是如何工作的?


2
你理解整数取模运算符 % 的含义吗? - dan04
我知道我来晚了,但是10%40应该是0。%符号获取除法的余数。 - jtsmith1287
4
如果余数为0,那么商是多少?剩下的10去哪里了? - Ted Bigham
1
无法复现。10m%40m返回预期的小数10,而不是声称的20。 - Vandroiy
2个回答

21
从C#语言规范中了解到,对于浮点数余数的情况,如果xy为正有限值,则x % y的结果z是通过计算x - n * y得到的,其中n是小于等于x / y的最大整数。C#语言规范还清楚地概述了所有可能组合的非零有限值、零、无穷大和NaN的情况下,如何处理浮点数x % y的表格。
                          y value

                | +y  –y  +0  –0  +∞  –∞  NaN
           -----+----------------------------  
  x         +x  | +z  +z  NaN NaN x   x   NaN
            –x  | –z  –z  NaN NaN –x  –x  NaN
  v         +0  | +0  +0  NaN NaN +0  +0  NaN
  a         –0  | –0  –0  NaN NaN –0  –0  NaN
  l         +∞  | NaN NaN NaN NaN NaN NaN NaN
  u         –∞  | NaN NaN NaN NaN NaN NaN NaN
  e         NaN | NaN NaN NaN NaN NaN NaN NaN

3
我总是将其视为从 x 中重复减去 y 的结果,直到 x 小于 y 为止。(这显然效率要低得多,但对我来说更容易理解。) - inejwstine

7
这篇 MSDN 上的文章有足够的示例,但我可以简单地解释一下;

http://msdn.microsoft.com/en-us/library/0w4e0fzs.aspx

如果你执行int result = x % y;,你会发现返回的是x % y的余数,并且这些值被视为整数。例如,链接中的第三行是Console.WriteLine(5.0 % 2.2);,它打印出.6。这是因为它发现2.2最多只能被放入5.0两次。所以它做了5 - 2.2(2),得到的结果是.6。

对于 x % y,它找到 y 完全地除 x a 次,然后给出余数。这意味着 y * (a + 1) 将大于 x,而 y * a 小于 x。它给出 xy * ax - (y * a) 之间的差异。 - evanmcdonnal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接