【问题标题】:Cash register cents calculation doesn't work? [closed]收银机美分计算不起作用? [关闭]
【发布时间】:2020-05-17 13:20:09
【问题描述】:

你应该拿回你的美分的部分不想工作,我试图尽我所能优化我的代码以减少代码行。

有什么帮助吗?

#include <iostream>
#include <math.h>
using namespace std;

int main() 
{

   double iAmount_due { 0 };

   double iGiven_money { 0 };

   double iMoney_back; 

   iMoney_back = iGiven_money - iAmount_due;

   int iMoney100 { 0 };
   int iMoney50  { 0 };
   int iMoney20  { 0 };
   int iMoney10  { 0 };
   int iMoney5   { 0 };
   int iMoney2   { 0 };
   int iMoney1   { 0 };
   int iCent25   { 0 }; 
   int iCent10   { 0 };
   int iCent5    { 0 };
   int iCent1    { 0 };

   cout << "Enter the amount due please: " << endl;

   cin >> iAmount_due;

   cout << "Enter the amount given please: " << endl;

   cin >> iGiven_money;


   if (iGiven_money >= iAmount_due) {

      iMoney_back = iGiven_money - iAmount_due;

      cout << "We will give you : " << iMoney_back << " $ back" << endl;

   }

   else {

      cout << "No money back" << endl;

   }


   while (iGiven_money >= iAmount_due) {

       iMoney100 = iMoney_back / 100;
       iMoney_back = (int)iMoney_back % 100;

       cout << "You will get: " << iMoney100 << " X 100 $ " << endl;

       iMoney50 = iMoney_back / 50;
       iMoney_back = (int)iMoney_back % 50;

       cout << "You will get: " << iMoney50 << " X 50 $ " << endl;

       iMoney20 = iMoney_back / 20;
       iMoney_back = (int)iMoney_back % 20;

       cout << "You will get: " << iMoney20 << " X 20 $ " << endl;

       iMoney10 = iMoney_back / 10;
       iMoney_back = (int)iMoney_back % 10;

       cout << "You will get: " << iMoney10 << " X 10 $ " << endl; 

       iMoney5 = iMoney_back / 5;
       iMoney_back = (int)iMoney_back % 5;

       cout << "You will get: " << iMoney5 << " X 5 $ " << endl; 


       iMoney2 = iMoney_back / 2;
       iMoney_back = (int)iMoney_back % 2;

       cout << "You will get: " << iMoney2 << " X 2 $ " << endl; 

       iMoney1 = iMoney_back / 1;
       iMoney_back = (int) iMoney_back % 1;

       cout << "You will get: " << iMoney1 << " X 1 $ " << endl;


       iCent25 = iMoney_back / 0.25;
       iMoney_back = fmod ((int)iMoney_back, 0.25);

       cout << "You will get: " << iCent25 << " X 0.25 $ " << endl;


       iCent10 = iMoney_back / 0.10;
       iMoney_back = fmod ((int)iMoney_back , 0.10);

       cout << "You will get: " << iCent10 << " X 0.10 $ " << endl;


       iCent5 = iMoney_back / 0.5;
       iMoney_back = fmod ((int)iMoney_back , 0.5);

       cout << "You will get: " << iCent5 << " X 0.5 $ " << endl;

       iCent1 = iMoney_back / 0.1;
       iMoney_back = fmod ((int)iMoney_back, 0.1);

       cout << "You will get: " << iCent1 << " X 0.1 $ " << endl;

       break;

   }

   return 0;
}

【问题讨论】:

  • “不想工作”是什么意思?
  • 就像它应该给你的那部分钱不想工作
  • 有时小数显示不正确,有时是 0.5,有时是 0.05
  • 你不应该用double来赚钱。而是使用unsigned long longdollars = money / 100; cents = money % 100;
  • Unsigned long 是一种可以处理小数的 int 类型吗? @scohe001 在答案的最后部分解释了如何做到这一点。基本上你乘以数字 * 100 所以你所有的数学都是整数。当你去展示你然后将美分转换为美元。

标签: c++ computer-science


【解决方案1】:

这是你的问题:

iMoney_back = (int)iMoney_back % 100;

让我猜猜:您尝试了iMoney_back % 100 并发现您不能将 mod (%) 与 double 一起使用。因此,您只需将其转换为 int。

虽然编译得很好,但模运算的结果仍然是一个 int。换句话说,您只是丢失了iMoney_back 的小数部分,所以对于您的程序,看起来不需要更改!

你可能想要fmod():

iMoney_back = fmod(iMoney_back, 100);

此外,看起来您实际上为 1 美分的值写了 .1,而不是 .01。修复这些问题和美分上的轻微舍入错误将向您展示这是有效的:https://ideone.com/0cWcuQ


或者,您可以创建一个 iMoney_back_cents 变量,它是一个 int,这样您甚至不需要担心双精度数(这可能会导致一些不精确的问题):

int iMoney_back_cents = (iMoney_back * 100) + .5;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-26
    • 2010-09-06
    • 1970-01-01
    • 1970-01-01
    • 2016-07-27
    相关资源
    最近更新 更多