当我意识到奇怪的事情时,我正在制作一个统一的剧本,在我完成剧本后,我在视觉工作室控制台项目中测试了我的实现。
class Program
{
static void Main(string[] args)
{
Console.WriteLine(-3.5 % 1);
Console.WriteLine(3.5 % (-1));
}
}
输出结果为:
-0.5
0.5
在两种情况下,模数运算符都不应该给我-0.5吗?
答案 0 :(得分:4)
C#的%运算符实际上是一个余数 - 因此它只返回分区剩下的内容。其中最重要的部分是剩余部分仅受分子符号的影响,而不受除数的影响。
在3.5为正的情况下,3将完全分裂,剩下0.5分 - -3.5,-3将完全分开,剩下-0.5。无论是除以-1还是1都不影响两种情况下的结果,其余部分将相同,并且仅受数字本身符号的影响。
答案 1 :(得分:3)
两种情况下模数算子都不应该给我-0.5吗?
为什么要这样?在数学上,0.5和-0.5都适用于这两种情况。
-3.5 = -3 * 1 + (-0.5)
-3.5 = -4 * 1 + 0.5
3.5 = -3 * (-1) + 0.5
3.5 = -4 * (-1) + (-0.5)
以编程方式,它由C#语言规范定义。
7.8.3剩余运营商
浮点余数:
float operator %(float x, float y); double operator %(double x, double y);
下表列出了所有可能组合的结果 非零有限值,零,无穷大和NaN。在表中,x 和y是正有限值。 z是x%y的结果,是 计算为x - n * y,其中n是最大可能的整数 小于或等于x / y。这种计算余数的方法是 类似于用于整数操作数的,但与IEEE不同 754定义(其中n是最接近x / y的整数)。
该表说明余数的符号与第一个操作数x的符号相同。
如果是-3.5 % 1
:
x = 3.5
y = 1
n = 3
z = 3.5 - 3 * 1 = 0.5
根据该表,结果为-z
,即-0.5。
如果是3.5 % -1
,x
,y
,n
,z
与上述相同。根据该表,结果为+z
,即0.5。