你好,我现在正在使用C#和.NET Framework书进行计算,我在其中一个练习中遇到了困难
编写C#程序进行更改。输入小于一美元的项目的成本。产量 使用季度,硬币,镍币和便士给予改变的硬币。使用最少的硬币 可能。例如,如果该项目成本为17美分,则变化将为四分之三,一个镍, 和三便士
由于我还在尝试掌握c#编程,我提出的最佳方法是使用while循环。
while(costOfItem >= 0.50)
{
costOfItem -= 0.50;
fiftyPence++;
}
我为每个牌照20,10,5等都有这些。 我正在检查金额是否大于或等于50便士,如果是这样,我从用户给出的金额减少50便士并将1加到fiftypence变量。
然后它移动到下一个while循环,我对每个pences都有。问题是,沿着线路的某个环路消失,比如说20便士,而costOfItem变成类似“0.1999999999999”,然后它永远不会下降到0,它应该得到正确的变化量。
任何帮助表示赞赏,请不要建议我已经涵盖的复杂程序。
答案 0 :(得分:5)
切勿使用double
或float
进行资金操作。使用Decimal
。
对于计算精度的所有其他问题,您必须使用“双倍Epsilon比较”,如Double.Epsilon for equality, greater than, less than, less than or equal to, greater than or equal to
答案 1 :(得分:0)
听起来我使用float
或double
作为costOfItem
的数据类型。
float
和double
将其值存储为二进制。但并非所有十进制值都具有二进制的精确表示。因此,存储非常接近的近似。这就是为什么你得到像" 0.1999999999999"。
对于资金计算,您应始终使用decimal
,因为它们可以避免这些小的不准确之处。
您可以在Jon Skeets awesome answer到Difference between Decimal, Float and Double in .NET?
中详细了解差异答案 2 :(得分:0)
如果你以美分计算,你可以使用整数,然后你就不会进入浮点舍入问题
答案 3 :(得分:0)
谢谢大家的快速回复。问题是我使用双而不是十进制所提供的链接让人们解释为什么在某些情况下这样做是错误的。在算术中应该避免使用 double ,因为显然有些浮点数没有精确的二进制表示,所以代替.23它给出0.2299999999999。将变量更改为十进制修复了我的问题