在使用小数的简单c++程序中遇到问题

Having trouble with simple c++ program using decimals.

本文关键字:程序 遇到 问题 c++ 简单 小数      更新时间:2023-10-16
//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

我的导师希望我写一个程序,可以计算出向杂志提交文章的作者的报酬。付给作者的钱是根据文章中的字数来计算的。它是这样工作的。。。

-如果长度(以文字计)小于7500:作者每字可获得0.08美元的报酬。

-如果长度是7500到8000:作者将获得固定的600美元报酬。

-如果长度是8000到17500:作者每个字的报酬是0.075美元。

-如果长度是17500到19000:作者将获得固定的1313美元报酬。

-如果长度超过19000:作者每字可获得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">

我是编程新手,我知道可能还有很多其他方法可以写这篇文章。但是请尽力帮助我。非常感谢。

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(2147483647)以下的数字。如果您的任何计算都将高于该值,那么您应该使用64位整数类型。

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;