Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么-2%360在c中给出-2而不是358#_C#_.net_Math - Fatal编程技术网

C# 为什么-2%360在c中给出-2而不是358#

C# 为什么-2%360在c中给出-2而不是358#,c#,.net,math,C#,.net,Math,微软数学和谷歌计算器给了我358的-2%360,但C#和windows计算器输出的是-2。。。哪个是正确答案 哪个是正确答案 两个答案都是正确的。返回哪个值只是一个惯例问题。两者都有,请参见。我发现这一解释很容易理解 彼得森博士,数学论坛 IMO,-2更易于理解和编码。如果你用-2除以360,你的答案是0余数-2。。。正如2除以360等于0除以2。认为358也是2—mod 360的其余部分是不自然的。< P>: 如果余数不为零,则有两种可能的选择 余数,一个是负数,另一个是正数,还有两个 商的可

微软数学和谷歌计算器给了我358的-2%360,但C#和windows计算器输出的是-2。。。哪个是正确答案

哪个是正确答案


两个答案都是正确的。返回哪个值只是一个惯例问题。

两者都有,请参见。

我发现这一解释很容易理解

彼得森博士,数学论坛
IMO,-2更易于理解和编码。如果你用-2除以360,你的答案是0余数-2。。。正如2除以360等于0除以2。认为358也是2—mod 360的其余部分是不自然的。

< P>:

如果余数不为零,则有两种可能的选择 余数,一个是负数,另一个是正数,还有两个 商的可能选择。通常,在数论中 总是选择正余数,但编程语言选择正余数 然而,根据语言和a和n的符号[2],帕斯卡 Algol68不满足负因子的这些条件 有些编程语言,如C89,甚至不定义结果,如果 n或a中的任何一个都是负数

C#编译器根据C#规范做了正确的事情,该规范规定,对于整数:

x%y
的结果是由
x–(x/y)*y
产生的值

请注意,
(x/y)
始终为四舍五入

有关如何计算二进制和十进制浮点数余数的详细信息,请参阅本规范第7.8.3节

这是否是您的“正确答案”,取决于您如何看待余数操作。其余部分必须满足以下标识:

dividend = quotient * divisor + remainder

我清楚地说-2%360是-2。为什么?首先问问你自己,商是多少。360进入-2的次数是多少?显然是零次!360根本没有进入-2。如果商为零,那么余数必须为-2才能满足恒等式。如果说360进入-2总共是-1次,剩下的358次,你不觉得很奇怪吗?

参见简单定义中的“编程语言中的商和余数”是“除法的余数”。根据这个定义,-2可能更正确——毕竟,当你将-2除以360时,你得到的是2的余数(或者-2,取决于你怎么看),你肯定得不到358。但对于计算应用程序来说,358通常是一个更有用的答案,这就是为什么有些语言选择返回它,这完全取决于您的观点。从一个角度看,你的最后一段很好。另一种观点的结果是
a%b
0..b-1
范围内。所以我不确定你是否能说358旅是错的。我认为最重要的是结果是由语言规范定义的。是的,我在看C++。问题:C#编译器显然做了正确的事情(因为它将正确的操作数推送到计算堆栈上,并调用
rem
)。尽管如此,编译器还是依赖于
rem
IL指令的定义行为来确保正确的C#行为。你会认为这是一个“实现”的细节,只要CLR团队决定<代码> REM < /C>有不同的行为(不发生,但一起玩),C团队将不得不请求一个特殊的代码> ReM2 IL指令?或者这就是重点:该语言是为了遵循IL规范而设计的?@dlev:对于ints上的每个基本C#操作,都有一条IL指令,这当然不是偶然的。早在1999年,IL设计师和C#设计师经常同时坐在同一个房间里。C#的设计是否与IL相匹配?IL的设计是否与C#相匹配?谁知道呢?这在时间的迷雾中消失了。我已经编程20年了,发现当我做N%M时,我总是希望结果在0..M-1范围内,所以-2%360应该是358。也就是说,大多数语言都不是这样工作的,所以我写了一个特殊的模函数来补偿。为什么这是自然的?一个圆有360度。如果要确保所有角度都在0..360范围内,自然要编写
角度%360
。但你很快就会意识到它不适用于负角度。
dividend = quotient * divisor + remainder