最近发现C#的运算符%
适用于double。尝试了一些东西,最终得出了这个测试:
class Program
{
static void test(double a, double b)
{
if (a % b != a - b * Math.Truncate(a / b))
{
Console.WriteLine(a + ", " + b);
}
}
static void Main(string[] args)
{
test(2.5, 7);
test(-6.7, -3);
test(8.7, 4);
//...
}
}
此测试中的所有内容均有效。
a % b
是否总是等同于 a - b*Math.Round(a/b)
?如果不是,请向我解释这个运算符的真正工作原理。
编辑:回答 James L,我知道这是模运算符和所有内容。我只对它如何处理 double ,我理解的整数感到好奇。
最佳答案
模运算符对浮点值的处理方式与对整数的处理方式相同。考虑一个简单的例子:
4.5 % 2.1
现在,4.5/2.1 约等于 2.142857
因此,除法的整数部分是 2。从 4.5 中减去 2*2.1,得到余数 0.3。
当然,此过程受浮点表示性问题的影响,因此请注意——您可能会看到意想不到的结果。例如,在 Stack Overflow 上看到这个问题:Floating Point Arithmetic - Modulo Operator on Double Type
Is a % b always equivalent to a - b*Math.Round(a/b)?
不,不是。这是一个简单的反例:
static double f(double a, double b)
{
return a - b * Math.Round(a / b);
}
static void Main(string[] args)
{
Console.WriteLine(1.9 % 1.0);
Console.WriteLine(f(1.9, 1.0));
Console.ReadLine();
}
关于如何指定模运算符的精确细节,您需要引用 C# 规范 – earlNameless's answer给你一个链接。
据我了解a % b
本质上等同于 a - b*Math.Truncate(a/b)
的模浮点精度.
关于c# - C#中 "%"对数值类型double的操作意义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8105613/