出于某种原因,当我的程序减去.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而不是荒谬的数字,我不需要建议,我需要一个例子
答案 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;
}
}