如何从减去两个双数得到0?

时间:2016-01-18 22:21:05

标签: c#

出于某种原因,当我的程序减去.1 - .1时,我得到的是2.7234235252E -17而不是0,为什么会这样?我该如何正确减去?作为第三个问题,如果我减去.1 - .1,bool是否认为它为0?例如:0 == .1 - .1 =是或否?

 List<string> hd1List = new List<string>();



        double hd1CD = 0;
        double hd2CD = 0;
        double hd3CD = 0;
        double hd4CD = 0;


       // for (int i = 0; i < 10; i++)
       // {


            if (hd1CD <= 0)
            {

                hd1List.Add("q");

                hd1CD = 4;
                hd1CD = hd1CD - .7;

            }


            Console.WriteLine(hd1CD);
            Console.WriteLine(hd2CD);
            Console.WriteLine(hd3CD);
            Console.WriteLine(hd4CD);


        if (hd2CD <= 0 && hd1CD >= .7)
            {

                hd1List.Add("e");
                hd2CD = 1;
                hd1CD = hd1CD - .7;
                hd2CD = hd2CD - .7;
            }

        Console.WriteLine(hd1CD);
        Console.WriteLine(hd2CD);
        Console.WriteLine(hd3CD);
        Console.WriteLine(hd4CD);

        if (hd3CD <= 0 && hd1CD >= .2 && hd2CD >= .2)
            {
                hd1List.Add("r");
                hd3CD = 5;
                hd1CD = hd1CD - .2;
                hd2CD = hd2CD - .2;
                hd3CD = hd3CD - .2;

            }

        Console.WriteLine(hd1CD);
        Console.WriteLine(hd2CD);
        Console.WriteLine(hd3CD);
        Console.WriteLine(hd4CD);

        if (hd4CD <= 0 && hd1CD >= .1 && hd2CD >= .1 && hd3CD >= .1)
            {
                hd1List.Add("w");
                hd4CD = 3;
                hd1CD = hd1CD - .1;
                hd2CD = hd2CD - .1;
                hd3CD = hd3CD - .1;
                hd4CD = hd4CD - .1;

            }


        Console.WriteLine(hd1CD);
        Console.WriteLine(hd2CD);
        Console.WriteLine(hd3CD);
        Console.WriteLine(hd4CD);

 if (hd4CD < 1.2 || hd1CD < 1.2 || hd2CD < 1.2 || hd3CD < 1.2 && hd4CD != 0 && hd1CD != 0 && hd2CD != 0 && hd3CD !=0)
The above is checking whether the variables hold 0, since im getting epsilon values my program cant run correctly...
            {
                //get minimum
                hd1List.Add("extra" + superList.Min());

                hd1CD = hd1CD - superList.Min();
                hd2CD = hd2CD - superList.Min();
                hd3CD = hd3CD - superList.Min();
                hd4CD = hd4CD - superList.Min();

            }

总结:我如何重新安排我的代码,以便如果我减去.1 - .1,它= 0而不是荒谬的数字,我不需要建议,我需要一个例子

2 个答案:

答案 0 :(得分:1)

您不应将双倍值与==进行比较。例如。有像

这样的代码

if (value==0) { /* do something here*/ }

如果value是双倍的,那么

是一个坏主意。

相反,你可以做类似的事情:

if (Math.Abs(value) < EPSILON) { /* do something here*/ }

其中EPSILON是一些小的正数/常数,例如1e-5

答案 1 :(得分:0)

虽然你有一个非常好的答案,但我认为我可以去重构你的代码。试试这个:

List<string> hd1List = new List<string>();
double[] hdCDs = new double[4];
double EPSILON = 0.00000001;

Action<int, double, double, string> update = (i, v, d, t) =>
{
    if (hdCDs[i] <= 0.0 && hdCDs.Take(i).All(x => x >= d))
    {
        hd1List.Add(t);
        hdCDs[i] = v;
        for (int x = 0; x <= i + 1; x++)
        {
            hdCDs[x] =- d;
        }
    }
    Console.WriteLine(String.Join(Environment.NewLine, hdCDs));
};

update(0, 4.0, 0.7, "q");
update(1, 1.0, 0.7, "e");
update(2, 5.0, 0.2, "r");
update(3, 4.0, 0.1, "w");

if (hdCDs.Any(x => x < 1.2) && hdCDs.All(x => x <= EPSILON))
{
    var min = superList.Min();
    hd1List.Add("extra" + min);
    for (int x = 0; x < hdCDs.Length; x++)
    {
        hdCDs[0] -= min;
    }
}