了解类型转换
Understanding Type Casting
我制作了一个非常简单的程序,用于向用户分发零钱(25 美分、10 美分、5 美分和便士)。它分配回与用户输入现金相同的数量、价值和变化。在我输入之前它表现良好:0.59
因此,在稍微修改程序之后,我能够解决这个问题。但是,我仍然不明白我到底做了什么来修复它...
int change_owed(浮点数)
{
int change, coins;
change = coins = 0;
change = (float)(amount * 1000000.0);
change /= 10000;
任何解释都很好。另外,如果这个问题已经被问到,我深表歉意。在搜索Whosebug时,我找不到解决方案。
问题是0.01
没有精确表示为浮点数,所以在计算变化时会出现舍入误差。理想的解决方案是完全避免使用浮点数。请改用定点算法。
例如,您可以使用整数值345
代替3.45
这样的浮点数来表示三美元四十五美分。这种类型的表示被称为定点,因为在倒数第二个数字之前有一个假定的小数点。
以下示例程序展示了一种将美元金额(如 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 );
}
我制作了一个非常简单的程序,用于向用户分发零钱(25 美分、10 美分、5 美分和便士)。它分配回与用户输入现金相同的数量、价值和变化。在我输入之前它表现良好:0.59 因此,在稍微修改程序之后,我能够解决这个问题。但是,我仍然不明白我到底做了什么来修复它...
int change_owed(浮点数) {
int change, coins;
change = coins = 0;
change = (float)(amount * 1000000.0);
change /= 10000;
任何解释都很好。另外,如果这个问题已经被问到,我深表歉意。在搜索Whosebug时,我找不到解决方案。
问题是0.01
没有精确表示为浮点数,所以在计算变化时会出现舍入误差。理想的解决方案是完全避免使用浮点数。请改用定点算法。
例如,您可以使用整数值345
代替3.45
这样的浮点数来表示三美元四十五美分。这种类型的表示被称为定点,因为在倒数第二个数字之前有一个假定的小数点。
以下示例程序展示了一种将美元金额(如 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 );
}