如何通过减去两个双精度数得到 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 而不是一个荒谬的数字,我不需要建议,我需要一个例子
您不应该将双精度值与 ==
进行比较。 例如,具有类似的代码
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;
}
}