C# double在999999/10000000上等于0

C# double在999999/10000000上等于0,c#,floating-point,C#,Floating Point,我有一个问题,我正在做一些个人的研究如何工作,但我没有走多远,直到我被难倒,所以代码atm应该返回大约100%的错误 double sum = 0, div = 3; DateTime t1 = DateTime.Now; List<double> l1 = new List<double>(); for (int a = 0; a < 10000000; a++) {

我有一个问题,我正在做一些个人的研究如何工作,但我没有走多远,直到我被难倒,所以代码atm应该返回大约100%的错误

        double sum = 0, div = 3;
        DateTime t1 = DateTime.Now;
        List<double> l1 = new List<double>();
        for (int a = 0; a < 10000000; a++)
        {
            sum = a / div;
            l1.Add(sum);
        }
        Console.WriteLine("Milisecond: " + DateTime.Now.Subtract(t1).TotalMilliseconds);
        t1 = DateTime.Now;
        List<double> l2 = new List<double>();
        for (int a = 0; a < 10000000; a++)
        {
            sum = a * div;
            l2.Add(sum);
        }
        Console.WriteLine("Milisecond: " + DateTime.Now.Subtract(t1).TotalMilliseconds);
        int c=0;
        int err = 0;
        for (int a = 0; a < (l1.Count < l2.Count ? l1.Count : l2.Count); a++)
        {
            c++;
            err += l1[a] != l2[a] ? 1:0;
        }
        Console.WriteLine("Error: " + 100*(err / c) + "%");
double sum=0,div=3;
DateTime t1=DateTime.Now;
列表l1=新列表();
对于(int a=0;a<10000000;a++)
{
总和=a/div;
l1.加(和);
}
WriteLine(“毫秒:+DateTime.Now.Subtract(t1.total毫秒));
t1=日期时间。现在;
列表l2=新列表();
对于(int a=0;a<10000000;a++)
{
总和=a*div;
l2.加(和);
}
WriteLine(“毫秒:+DateTime.Now.Subtract(t1.total毫秒));
int c=0;
int err=0;
对于(int a=0;a<(l1.Count
但最后一行返回0,显然是9999999/10000000=0


有没有办法解决这个问题?我最好的猜测是这是一个浮动问题。(但现在我知道这是我的doh错误)

这不是
浮动问题;这是一个
int
问题。在分割之前,需要将
err
转换为
double

Console.WriteLine("Error: " + 100 * ((double)err / c) + "%");

该操作的变量被声明为int,因此该操作是在整数上进行的,结果只会转换为double

要获得双重结果,您可以执行以下操作:

dRes = (double)x / y;
顺便说一下,有一种更好的方法来测试代码的运行时间:

Stopwatch sw = Stopwatch.StartNew();

// ... Some code

sw.Stop();
Console.WriteLine(sw.Elapsed);

别担心。Doh错误是纪律的一部分。我们都做过几次。秒表从未听说过,但我试过,我必须说声谢谢。+1感谢
秒表
;提供比日期时间更好的分辨率。现在