当前位置: 首页 > 知识库问答 >
问题:

C while循环棘手的异常[重复]

窦国源
2023-03-14

我是一个初学者,这是我正在编写的代码的一部分(简化版):

int main(void)
{
    float amount = 0;
    printf("$ ");
    amount = get_float();

    int n = 0;
    while ((amount - 0.05) >= 0)
    {
        amount -= 0.05;
        n ++;
    } 
    printf("%i nickels\n", n);

}

哪里出了问题?请帮忙...非常感谢您抽出时间!

共有1个答案

陈誉
2023-03-14

从最严格的意义上说,代码中没有bug,因为基本的推理是正确的;但是请注意,0.35值不能在float数据类型中准确表示,对于0.05也是如此;当除法(基本上是问题中代码的语义)通过反复的减法来实现时,由于无法准确地表示所需的值而造成的错误就会累积起来。结果是减去的次数与分析预期的结果不同,因为终止条件达到得太快。floatdatatype不适合财务计算,即使在这样一个非常小的日常示例中也是如此。

这是可怕的,但这是事实。

 类似资料:
  • 问题内容: 在玩循环的同时创建了以下代码。下面的代码将斐波那契值存储到数组中,然后使用for循环将其打印出来。 上面的代码工作正常。但是,第一次将它们放在一起时,我使用了增强的for循环来打印出值(代码中的第二个for循环)。可以很好地编译,但是运行时得到以下信息: 我不明白出了什么问题。更改第二个循环不应更改值(您会注意到斐波那契值是错误的(即缺少值))。而且我不明白为什么简单的增强型for循环

  • 正在使用Apache Camel JMS、XA事务(atomikos)和Java/Spring。添加了一些代码来处理camel路由和业务逻辑处理过程中可能发生的异常,即使用OnException。下面是在我们进入一个问题之前的实际代码,在异常发生后,onException代码按照指定的数量像重试一样处理它;将控件发送到错误处理程序,然后继续循环,一次又一次地处理相同的消息,并在发生异常和重试失败时

  • 我希望程序在捕获异常时重新执行 while 循环 - 异常正在接收文本输入。相反,它继续使用下面的代码进行一段时间循环,我希望它再次要求用户输入。 输出:

  • 问题内容: 我有这段代码。我想回到循环的起点,并再次要求用户输入。但是,它总是循环而不停止请求输入。我的代码有什么问题?谢谢 问题答案: 从http://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html#nextInt%28int%29: “如果翻译成功,则扫描程序将前进经过匹配的输入。” 啊,但是如果翻译是什么 不是 成功的?在这种

  • 问题内容: 我有一个对象,该对象具有对另一个对象的循环引用。考虑到这些对象之间的关系,这是正确的设计。 为了显示 不出所料,当我尝试使用Json序列化计算机或客户对象时遇到了一个问题。我不确定是如何解决此问题的,因为我不想破坏计算机和客户对象之间的关系。解决此问题有哪些选择? 编辑 目前,我正在使用Controller基类提供的Json方法。因此,我正在做的序列化基本如下: 问题答案: 更新: 不

  • 我试图处理一个用户输入,并允许只输入浮动。可以输入的浮点数是无限的,但是如果连续输入两个非浮点数,程序将结束。当程序结束时,它将打印所有数字的和。 问题是,每当我运行这个时,它立即运行while循环,将计数增加到2,并中断循环。在取消之前,您只能输入一个非浮点数。 编辑:正如你们中的一些人所指出的,count应该在while循环之前初始化