c# - C#中 "%"对数值类型double的操作意义

标签 c# modulo

最近发现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/

相关文章:

c# - 位图到 int[] 使用 Marshal.Copy()

c# - 混合模式程序集是针对旧版本的运行时构建的,如果没有额外的配置就无法加载

c# - 如何在字符串数组上使用 Sum - LINQ?

Java 模运算符

C 具有负股息和除数的模运算差异是长无符号的

Ruby 模除法

c# - 在 nodatime 上添加两个句点

c# - 在身份中获取当前用户的电子邮件

solr - 如何在Solr 3.3中实现mod功能

c - 使用 rand() 函数的程序