【问题标题】:Understanding Type Casting了解类型转换
【发布时间】:2015-03-18 22:23:00
【问题描述】:

我制作了一个非常简单的程序,可以将零钱(硬币、硬币、镍币和便士)分发给用户。它以用户输入现金的方式分配回相同的金额,价值。在我输入之前它表现良好:0.59 因此,在稍微修改程序后,我能够解决这个问题。但是,我仍然不明白我到底做了什么来修复它......

int change_owed(浮动金额) {

int change, coins;
change = coins = 0;

change = (float)(amount * 1000000.0);
change /= 10000;

任何解释都会很棒。另外,如果已经问过这个问题,我深表歉意。在搜索stackoverflow时,我找不到解决方案。

【问题讨论】:

  • 我们需要比这更多的代码,变化和数量是什么类型?
  • 演员可能在这个代码示例中没有做任何事情,但这里的背景可能会有所帮助:stackoverflow.com/questions/2100490/…
  • change 为整数,amount 为浮点数。
  • 那么请更新问题以说明这一点,最好显示changeamount的实际声明。
  • 处理金钱的程序永远不能使用浮点值。浮点数(和双精度数)用于更高的数学,而不是加减需要精确的数量。

标签: c casting


【解决方案1】:

问题是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, &cents );

    if ( count == 1 )
        amount = dollars * 100;
    else if ( count == 2 && cents < 100 )
        amount = dollars * 100 + cents;
    else
        amount = 0;

    printf( "%d\n", amount );
}

【讨论】:

  • 非常感谢您的反馈,user3386109。
猜你喜欢
  • 1970-01-01
  • 2019-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-01
  • 2021-11-19
相关资源
最近更新 更多