如何通过减去两个双精度数得到 0

本文关键字:双精度 两个 何通过 | 更新日期: 2023-09-27 18:30:50

出于某种原因,当我的程序减去 .1 - .1 时,我得到 2.7234235252E -17 而不是 0,为什么会这样? 我怎样才能正确减去? 作为第三个问题,如果我确实减去 .1 - .1,布尔是否认为它是 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 而不是一个荒谬的数字,我不需要建议,我需要一个例子

如何通过减去两个双精度数得到 0

您不应该将双精度值与 == 进行比较。 例如,具有类似的代码

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

如果value是双精度,则是一个坏主意。

相反,您可以执行以下操作:

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

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

虽然你有一个很好的答案,但我想我会尝试重构你的代码。试试这个:

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;
    }
}