Double在9999999 / 10000000上等于0

本文关键字:10000000 9999999 Double | 更新日期: 2023-09-27 18:18:36

我有一个问题,我正在做一些个人研究这是如何工作的http://www.codeproject.com/Articles/17480/Optimizing-integer-divisions-with-Multiply-Shift-i但我没有得到远,直到我被难住了,所以代码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) + "%");

但是最后一行返回0显然9999999/10000000 = 0

对于如何解决这个问题有什么想法吗?我最好的猜测是这是一个浮动问题。(但现在我知道这是我的错误)

Double在9999999 / 10000000上等于0

该操作的变量声明为int,因此该操作是对整型进行的,然后才将结果转换为double类型。

要获得双精度结果,您可以这样做:

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

Stopwatch sw = Stopwatch.StartNew();
// ... Some code
sw.Stop();
Console.WriteLine(sw.Elapsed);

这不是float的问题;这是一个int问题。你需要把err变成double,然后再把它分开。

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