模数运算符中的C#Bug%

Sel*_*irK 7 .net c# math modulo

解决了一个错误,我得到了一些有趣的发现.

这个程序的结果

    static void Main(string[] args)
    {
        int i4 = 4;
        Console.WriteLine("int i4 = 4;");
        Console.WriteLine("i4 % 1 = {0}", i4 % 1);

        double d4 = 4.0;
        Console.WriteLine("double d4 = 4.0;");
        Console.WriteLine("d4 % 1 = {0}", d4 % 1);
        Console.WriteLine("-----------------------------------------------------------");
        int i64 = 64;
        double dCubeRootOf64 = Math.Pow(i64, 1.0 / 3.0);
        Console.WriteLine("int i64 = 64;");
        Console.WriteLine("double dCubeRootOf64 = Math.Pow(i64, 1.0 / 3.0) = {0}", dCubeRootOf64);
        Console.WriteLine("dCubeRootOf64 = {0}", dCubeRootOf64);
        Console.WriteLine("dCubeRootOf64 % 1 = {0} ??????????????  Why 1. ??????????", dCubeRootOf64 % 1);

        Console.ReadLine();
    }
Run Code Online (Sandbox Code Playgroud)

int i4 = 4;
i4 % 1 = 0
double d4 = 4.0;
d4 % 1 = 0
-----------------------------------------------------------
int i64 = 64;
double dCubeRootOf64 = Math.Pow(i64, 1.0 / 3.0) = 4
dCubeRootOf64 = 4
dCubeRootOf64 % 1 = 1 ??????????????  Why 1. ??????????
Run Code Online (Sandbox Code Playgroud)

int 4 % 1 = 0 - 对

double 4.0 % 1 = 0 - 对

但是错误在于:

Math.Pow(64,1.0/3.0)%1 = 1

来自64的立方根是4.为什么在这种情况下4 % 1 = 1呢?

SLa*_*aks 12

Math.Pow(64, 1.0 / 3.0)回报3.9999999999999996.显示时
会四舍五入4.

取模1返回0.99999999999999956,1在显示时同样四舍五入.

您可以通过添加来查看真实值 .ToString("R")