【问题标题】:Having trouble with simple c++ program using decimals.使用小数的简单 c++ 程序遇到问题。
【发布时间】:2014-02-26 02:43:50
【问题描述】:
//Purpose: To calculate the price to pay an author
//Programmer: Brandon C Ballard
//Last Updated: 2/20/2014

#include <iostream>
#include <cstdlib>

using namespace std;

//function prototype
float TotalPay(int numWords, char Level);

int main()
{
    float TotalPay;
    int numWords;
     char Level;
    int amtToPay;

    cout << "Please enter number of words: ";
    cin >> numWords;
    cout << endl;
    cout << "Please enter a Level, A,B, or C: ";
    cin >> Level; cout << endl << endl;

    //calculate price per word
    if (numWords < 7500)
    amtToPay = numWords * .08;
    else if (numWords >= 7500 && numWords < 8000)
    amtToPay = 600;
    else if (numWords >= 8000 && numWords < 17500)
    amtToPay = numWords * .075;
    else if (numWords >= 17500 && numWords < 19000)
    amtToPay = 1313;
    else 
    amtToPay = numWords *.07;

    //calculate the Level of the author
    if (Level == 'C' or Level == 'c')
    Level = 1;
    else if (Level == 'B' or Level == 'b')
    Level = 1.25;
    else if (Level == 'A' or Level == 'a')
    Level = 1.75;

    TotalPay = amtToPay * Level;
    cout << "Length of Story (words): "; cout << numWords; cout << endl << endl;
    cout << "Amount Due Author: "; cout << "$"; cout << TotalPay; cout << endl << endl << endl;

    system("PAUSE");
    return 0;
}//end main function

我的导师希望我编写一个程序,该程序可以计算向向杂志提交文章的作者支付的金额。支付作者的金额取决于文章中的字数。它是这样工作的......

-如果长度(以字为单位)小于 7,500:作者每字获得 0.08 美元的报酬。

-如果长度为 7,500 到 8,000:作者获得固定的 600 美元报酬。

-如果长度为 8,000 到 17,500:作者每字获得 0.075 美元的报酬。

-如果长度为 17,500 到 19,000:作者获得固定的 1313 美元报酬。

-如果长度大于 19,000:作者每字获得 0.08 美元的报酬。

另外:作者分为三个不同的“级别”(A、B 和 C)。 “C”级作者(新作者)将根据上述信息获得报酬。 “B”级作者(知名作家)的报酬是 C 级作者的 1.25 倍。 “A”级作者(摇滚明星)的报酬是 C 级作者的 1.75 倍。

数学:基本上,我编写了程序,以便它首先计算支付给作者的金额(amtToPay)。然后,它计算 (Level) 等于什么。那么 (TotalPay) 就是 (amtToPay) 乘以 (Level)。

我的问题:除了计算作者级别的部分之外,一切都很好。例如,如果我将作者输入为“A”级,他的报酬应该是 C 级作者的 1.75 倍。因此,它应该将 (amtToPay) 乘以 1.75,但实际所做的是将其乘以“1”并忽略“.75”。

我是编程新手,我知道可能还有很多其他方法可以编写这个。但请尽量帮助我。谢谢。

【问题讨论】:

  • 你从来没有定义过的函数原型,然后用同名的正则变量怎么办?
  • 您通常应该只使用整数并跟踪小数位...例如 rateInMil = 75 而不是 .075...然后您可以毫无意外地使用 int 数学。
  • Level 的重用也很恶心......而且它会截断双精度值 1-1.99999 是相同的

标签: c++ c decimal


【解决方案1】:

Level 是整数类型,因此当您将浮点数分配给它时,小数部分将被删除。

尝试定义double rateLevel,然后

if (Level == 'C' or Level == 'c')
rateLevel = 1;
else if (Level == 'B' or Level == 'b')
rateLevel = 1.25;
else if (Level == 'A' or Level == 'a')
rateLevel = 1.75;

TotalPay = amtToPay * rateLevel;

这样做的正确方法是根本不使用浮点类型,打印输出除外。实现此目的的方法是将所有内容按 10 次方缩放,这将从您的值中删除所有小数部分。在您的代码中,最低有效位是千位(0.075)。这意味着您需要将所有值乘以 1000。这称为比例因子。然后,您可以仅使用整数类型进行数学运算,intlongint64_t 等。在计算结束时,您可以将结果拆分为整数和小数部分。

像这样:

int TotalPayDollars = TotalPay/1000;
int TotalPayMilliDollars = TotalPay - 1000*TotalPayDollars;
int TotalPayCents = (int)((double)TotalPayMilliDollars/10 + 0.5);

第一行都是整数数学,所以除以 1000 会丢弃任何小数部分。

第二行查找原始值与截断值之间的差异。我们将 TotalPayDollars 乘以 1000 以再次将其归入与 TotalPay 相同的单位。

在最后一行中,+ 0.5 用于四舍五入到最接近的分。

注意:在选择比例因子时,确保不会溢出整数类型非常重要。 32 位有符号整数最多只能容纳 2^31-1 (2,147,483,647) 的数字。如果您的任何计算将高于该值,那么您应该使用 64 位整数类型。

【讨论】:

  • 那么我该如何解决这个问题?
  • 我在答案中添加了一些内容来说明如何解决它。
  • 讲师说它必须是 int 值而不是 double
  • 在这种情况下,我会遵循 Grady Player 在 cmets 中给出的建议,并将所有计算作为整数进行。将您的单位从美元(如果那是您的货币)转换为千分之一美元。例如:而不是'amtToPay = numWords * .075;'写amtToPayMilliDollars = numWords * 75;。在计算的最后,您可以通过除以 1000 转换回美元。
【解决方案2】:

Levelchar 类型,它是整数,你应该专门创建一个新变量来保存级别提升的数量:

double level_boost;
//logic
Totalpay = amtToPay * level_boost;

PS:在你的逻辑中,你不必使用&amp;&amp;

if (numWords < 7500)
amtToPay = numWords * .08;
else if (numWords < 8000) 
//if the numwords is less than 7500 will be handled by first if
amtToPay = 600;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-25
    • 2015-04-08
    相关资源
    最近更新 更多