【问题标题】:scanf doesn't read doublescanf 不读取双倍
【发布时间】:2016-03-31 15:13:48
【问题描述】:

我在 c 中遇到了关于减号操作的问题。

printf("\nPlease enter your payment:\n", userpayment);
scanf("%.2f", &userpayment);

customerchange = userpayment - totalfinal;
printf("The amount of change is %.2f\n", customerchange);

我将userpaymenttotalfinal 声明为double

例如,每当我输入价格时; userpayment = 2000totalfinal 为 1500,输出将始终为 1500。 有什么办法解决这个问题?

这是输出:

输入商品价格: 500 输入项目数量: 3 支付总额为:RM1500.00 这是最后一项吗? 是的 已给予客户RM50现金回扣。 现金返还前的总付款为:1500 返现后的总付款为1450

请输入您的付款: 5000 你的零钱是 RM-14500.00

【问题讨论】:

  • 货币不要使用双打
  • 如果我们看看所有涉及的变量是如何声明的,会更容易提供帮助。
  • 说真的,不要使用双打货币。我知道这不是您所要求的,但最佳做法是使用具有整数类型的次要单位,或使用专用数据类型来表示货币。浮点数适用于表示不需要特别准确的大量数字。将它们用于货币会迫使您在整个代码库中传播舍入错误检查和显式舍入。

标签: c


【解决方案1】:

如果“userpayment”被定义为double,那么改变

scanf("%.2f", &userpayment);

scanf("%lf", &userpayment);

或者将你的变量改为浮点数。

就目前而言,您正在将浮点数扫描到双精度数的内存中,从而导致不可预知的行为。

【讨论】:

  • 还要注意“.”说明符在 scanf 中无效,但很可能会被忽略。
【解决方案2】:

scanf 中的格式说明符不正确。阅读文档。

http://www.cplusplus.com/reference/cstdio/scanf/

您还应该检查scanf 的返回值,以确保它能够解析您期望它解析的内容。

此外,如果您已阅读编译器警告,您本可以省去提出这个问题的麻烦。

【讨论】:

    【解决方案3】:

    您对 printf 的格式感到困惑,它相似但不一样,请尝试将 %.2f 替换为 %lf

    【讨论】:

      【解决方案4】:

      由于您将变量定义为 double,因此您应该使用:

      scanf("%lf", &userpayment);
      

      f 表示浮点值,lf(长浮点)表示双精度值。

      【讨论】:

      • 我没有注意到错字,谢谢。我更正了。
      猜你喜欢
      • 2016-01-21
      • 2015-09-04
      • 2012-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-15
      相关资源
      最近更新 更多