我做了一个非常简单的程序,将更改(四分之一,硬币,硬币和便士)分发给用户。它以与用户现金相关的变化分配相同的金额,价值。在输入之前它表现良好:0.59 所以,在修改程序后,我能够解决这个问题。但是,我仍然不明白我究竟做了什么正确的修复......
int change_owed(浮动金额) {
int change, coins;
change = coins = 0;
change = (float)(amount * 1000000.0);
change /= 10000;
任何解释都会很棒。此外,如果已经提出这个问题,我道歉。在搜索stackoverflow时,我找不到解决方案。
答案 0 :(得分:2)
问题是0.01
没有精确表示为浮点数,因此计算更改时会出现舍入错误。理想的解决方案是避免使用浮点数。改为使用定点算法。
作为示例,您可以使用整数值3.45
而不是像345
这样的浮点数来表示三美元和四十五美分。这种类型的表示称为定点,因为在倒数第二个数字之前有一个假定的小数点。
以下示例程序显示了一种将美元金额(如3.45)作为固定点数读取的方法。
int main( void )
{
int dollars, cents, count, amount;
printf( "Enter amount: " );
fflush( stdout );
count = scanf( "%d.%d", &dollars, ¢s );
if ( count == 1 )
amount = dollars * 100;
else if ( count == 2 && cents < 100 )
amount = dollars * 100 + cents;
else
amount = 0;
printf( "%d\n", amount );
}