使用小数的简单c ++程序有问题。

时间:2014-02-26 02:43:51

标签: c++ c decimal

//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)。然后,它计算(等级)等于什么。然后(TotalPay)是(amtToPay)乘以(Level)。

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

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

2 个答案:

答案 0 :(得分: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等进行数学运算。在计算结束时,您可以将结果拆分为整数和小数分量。< / p>

像这样:

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位整数类型。

答案 1 :(得分:1)

Levelchar类型,它是不可或缺的,你应该专门创建一个新变量以保持按级别提升的数量:

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

PS:在您的逻辑中,您不必使用&&

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;