[英]why I'm getting the wrong change when entering 700 but for 800 works fine?
DispenseAlgorithm如您所见,我正在尝试创建一个程序,在减去特定金额后显示剩余的钞票,所以我的算法有什么问题
public abstract class DispenseAlgorithm
{
public abstract Dictionary<int, int> CalculateDispense(CassetteData[] data, int summ);
}
public class CassetteData
{
public int UID { get; set; }
public int Nominal { get; set; }
public int Count { get; set; }
public CassetteData() { }
}
public class CalculateDispenser : DispenseAlgorithm
{
public int Num { get; set; }
public double Num1 { get; set; }
public double Num2 { get; set; }
public int Num3 { get; set; }
public int Num4 { get; set; }
public int Num5 { get; set; }
public int Num6 { get; set; }
public override Dictionary<int, int> CalculateDispense(CassetteData[] data, int summ)
{
this.Num=summ;
Random rnd1 = new Random();
Console.WriteLine("IN THE BANK YOU HAVE");
CassetteData[] myO = { new CassetteData { UID = 1, Nominal = 10 , Count = 100 },
new CassetteData { UID = 2, Nominal = 50, Count = 100},
new CassetteData { UID = 3, Nominal = 100 , Count = 100 },
};
foreach (CassetteData o in myO)
{
Console.WriteLine("{0} {1} Rubles {2} notes",o.UID , o.Nominal,o.Count);
}
for(int i = 0; i < 3; i++)
{
Num1 += myO[i].Nominal*myO[i].Count;
Num2 = Num1/summ;
Num6 = (int)Math.Round(Num2);
}
for (int i = 0; i < 3; i++)
{
Num3 = (myO[i].Nominal * myO[i].Count) / Num6;
Num4 += Num3;
Console.WriteLine(Num3);
}
Console.WriteLine("divition " + Num6);
Console.WriteLine(Num4);
Dictionary<int, int> d = new Dictionary<int, int> ();
Console.WriteLine("Remaining");
d.Add(1, Math.Abs((myO[0].Nominal * myO[0].Count) / (Num6)/myO[0].Nominal));
d.Add(2, Math.Abs((myO[1].Nominal * myO[1].Count) / (Num6) / myO[1].Nominal));
d.Add(3, Math.Abs((myO[2].Nominal * myO[2].Count) / (Num6) / myO[2].Nominal));
foreach (KeyValuePair<int, int> kvp in d)
{
Console.WriteLine("{0} {1} packs",
kvp.Key, kvp.Value);
}
Console.WriteLine("SUM Subtracted = " + Num4);
return d;
}
}
减去 800 后,我得到 5 5 5 包,这意味着 5 10+5 50+5*100 = 800 正确,但输入 700 时不同
因此,在调查您的代码后,似乎由于舍入而引入了偏移量,
我对您的代码进行了一些更改,现在它按预期工作,
请在更改后的代码下方找到
公共摘要 class DispenseAlgorithm
{
公共抽象 Dictionary<int, int> CalculateDispense(CassetteData[] data, int summ);
}
public class CassetteData
{
public int UID { get; set; }
public int Nominal { get; set; }
public int Count { get; set; }
public CassetteData() { }
}
public class CalculateDispenser : DispenseAlgorithm
{
public int Num { get; set; }
public double Num1 { get; set; }
public double Num2 { get; set; }
public double Num3 { get; set; }
public double Num4 { get; set; }
public int Num5 { get; set; }
public double Num6 { get; set; }
public override Dictionary<int, int> CalculateDispense(CassetteData[] data, int summ)
{
this.Num = summ;
Random rnd1 = new Random();
Console.WriteLine("IN THE BANK YOU HAVE");
CassetteData[] myO = { new CassetteData { UID = 1, Nominal = 10 , Count = 100 },
new CassetteData { UID = 2, Nominal = 50, Count = 100},
new CassetteData { UID = 3, Nominal = 100 , Count = 100 },
};
foreach (CassetteData o in myO)
{
Console.WriteLine("{0} {1} Rubles {2} notes", o.UID, o.Nominal, o.Count);
}
for (int i = 0; i < 3; i++)
{
Num1 += myO[i].Nominal * myO[i].Count;
Num2 = Num1 / summ;
Num6 = Num2; // (int)Math.Round(Num2);
Console.WriteLine("Num1 {0} Num2 {1} Num6 {2} ", Num1, Num2, Num6);
}
for (int i = 0; i < 3; i++)
{
Num3 = (myO[i].Nominal * myO[i].Count) / Num6;
Num4 += Num3;
Console.WriteLine(Num3);
}
Console.WriteLine("division " + (int)Math.Round(Num6));
Console.WriteLine(Num4);
Dictionary<int, int> d = new Dictionary<int, int>();
Console.WriteLine("Remaining");
d.Add(1, Math.Abs((myO[0].Nominal * myO[0].Count) / (int)Math.Round(Num6) / myO[0].Nominal));
d.Add(2, Math.Abs((myO[1].Nominal * myO[1].Count) / (int)Math.Round(Num6) / myO[1].Nominal));
d.Add(3, Math.Abs((myO[2].Nominal * myO[2].Count) / (int)Math.Round(Num6) / myO[2].Nominal));
foreach (KeyValuePair<int, int> kvp in d)
{
Console.WriteLine("{0} {1} packs", kvp.Key, kvp.Value);
}
Console.WriteLine("SUM Subtracted = " + Num4);
return d;
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.