3 캔을 포함하는 표준 상자가있는 시나리오가 있습니다. 디스플레이 및 쿼리 목적으로 표준 구성의 십진수로보고해야합니다. 그것은 등 3 캔 1 개 상자에 2 캔 1 상자를 ... 말을 할 수 없습니다
상자의 분수를 계산할 때 소수 정확도 손실
예를 들어, 처음에 나는 다음 결과 1 캔을 제거
3 캔 1 상자를해야합니다 3 캔
의 0.66 되풀이 상자에 내가 더 후 (1) 3 캔
의 0.33 되풀이 상자에 결과 수 그때 0.0000000000000000000000000001 상자 3 캔
마지막 깡통을 제거하면 값이 0 캔 3 캔 0 상자 0 개가 모두 원래 상자에서 제거 될 수 있기를 바랍니다. 유한 비트 수를 처리 할 때 0.33 반복을 나타낼 수 없다는 사실로 인해 정밀도가 손실된다는 점에 감사드립니다.
질문 : 반올림 (금융 어쩌면)을 사용해야하는 시스템에 더 많은 경험이있는 사람들을 위해이 문제를 해결할 수있는 옵션은 무엇입니까? 마지막 상자를 제거하게되면 상자가 더 이상 존재하지 않을 수 있습니다.
편집 :
결국. Loren Pechtel 제안을 사용하여 캔 수를 저장하면 총 상자 수를 표준 상자에있는 캔 수로 나눠 얼마나 많은 표준 상자를 표시해야 하는지를 재귀 적 결과를 얻을 수 있지만보고 할 때는 괜찮습니다. 사물의 측면. 여기
static void Main(string[] args)
{
var box = new StandardBox(3);
var boxDetail = new BoxDetail(1.0m, box);
var allBoxes = new AllBoxes();
allBoxes.AddBox(boxDetail);
allBoxes.RemoveItemFromBox(boxDetail, 1.0m);
Console.WriteLine(allBoxes);
allBoxes.RemoveItemFromBox(boxDetail, 1.0m);
Console.WriteLine(allBoxes);
allBoxes.RemoveItemFromBox(boxDetail, 1.0m);
Console.WriteLine(allBoxes);
Console.ReadLine();
}
}
public class StandardBox
{
private decimal _quantity;
public StandardBox(decimal quantity){_quantity = quantity;}
public decimal Quantity {get { return _quantity; }}
}
public class BoxDetail
{
private decimal _quantity;
private StandardBox _box;
public BoxDetail(decimal quantity, StandardBox box)
{
_quantity = quantity;
_box = box;
}
public void RemoveItem(decimal quantity)
{
var newQuantity = quantity/_box.Quantity;
_quantity = _quantity - newQuantity;
}
public override string ToString()
{
return _quantity.ToString() + " of " + _box.Quantity.ToString();
}
}
public class AllBoxes
{
private List<BoxDetail> allBoxes = new List<BoxDetail>();
public AllBoxes(){}
public void AddBox(BoxDetail box){allBoxes.Add(box);}
public void RemoveItemFromBox(BoxDetail box, decimal quantity)
{
var boxDetailLineToModify = allBoxes.Find(b => b.Equals(box));
boxDetailLineToModify.RemoveItem(quantity);
}
public override string ToString()
{
var results = string.Empty;
foreach (var box in allBoxes)
{
results += box.ToString() + "\n";
}
return results;
}
}
무한 정밀도 산술 라이브러리를 사용할 수 있습니다. – SLaks
소수 대신 double을 사용하십시오. – jacknad
처음에 두 번 시도했는데 세 번째 캔을 제거한 결과는 1.11022302462516E-16 of 3 – lostinwpf