无法计算正确的小数位数

时间:2010-03-25 21:47:42

标签: c++

我正在尝试创建一个程序,它将执行一些简单的计算,但是在程序没有正确的数学运算,或正确放置小数或其他东西时遇到问题。我问过的其他一些人也无法理解。

以下是代码:http://pastie.org/887352

输入以下数据时:

  • 每周工资: 500
  • 提高: 3
  • 受雇年限: 8

输出以下数据:

Year   Annual Salary
1      $26000.00
2      $26780.00
3      $27560.00
4      $28340.00
5      $29120.00
6      $29900.00
7      $30680.00
8      $31460.00

它应该输出:

Year   Annual Salary
1      $26000.00
2      $26780.00
3      $27583.40
4      $28410.90
5      $29263.23
6      $30141.13
7      $31045.36
8      $31976.72

以下是该任务的完整描述:

8.17(加薪计算器应用程序)开发一个应用程序,用于计算员工每年在用户指定的年数内赚取的金额。假设员工每年收到一次加薪。用户在申请中指定初始周薪,加薪金额(以每年百分比表示)和计算所赚取金额的年数。应用程序应该如图8.22所示运行。在你的文字中。 (图8.22是我在上面发布的输出作为我的程序应该发布的内容)

  1. 打开模板源代码文件。在文本编辑器或IDE中打开PayRaise.cpp文件。

  2. 定义变量并提示用户输入。为了存储用户输入的上升百分比和就业年数,在第12行的主要后面定义int变量率和年份。还定义双变量工资来存储用户的年工资。然后,插入语句,提示用户提高百分比,就业年限和开始每周工资。将键盘输入的值分别存储在rate,years和wage变量中。要找到年工资,请将新工资乘以52(每年的周数)并将结果存入工资。

  3. 显示表格标题和格式输出。使用left和setw流操纵器显示表头,如图8.22所示。第一列应为六个字符宽。然后使用fixed和setprecision流操纵器来设置小数点左边两个位置的浮点值。

  4. 编写for语句标题。插入for语句。在for语句标题中的第一个分号之前,定义变量计数器并将其初始化为1.在第二个分号之前,输入循环继续条件,该条件将导致for语句循环,直到计数器达到输入的年数。在第二个分号后,输入计数器的增量,以便for语句每年执行一次。

  5. 计算加薪。在for语句的主体中,显示第一列中counter的值和第二列中salary的值。然后计算下一年的新周工资,并将结果值存储在工资变量中。为此,在百分比增加中加1(确保将百分比除以100.0)并将结果乘以工资中的当前值。

  6. 保存,编译并运行应用程序。输入工资增长的加薪百分比和年数。查看结果以确保显示正确的年份并确保未来的工资结果正确。

  7. 关闭命令提示符窗口。

  8. 我们无法弄明白!非常感谢任何帮助,谢谢!

4 个答案:

答案 0 :(得分:5)

不要将钱存放为浮点数。这只会以泪水结束。存钱作为整数美分。

原因是计算机上的浮点数学必然是不精确的。你知道0.40 / 2 = 0.20,但完全有可能计算机会说它是0.19999999999999,并且这不是错误。浮点数的内部表示使计算机不可能准确地表示某些分数,就像你不能写出1/3的精确十进制表示(没有无限量的纸张)。 / p>

当您处理具有小数部分且不准确的数字(例如金钱)的数字时,必须使用定点数学进行计算。一般来说,你可能会使用一个定点库,但对于像这样的作业,如果你不允许这样做,那么存储一些便士的int就可以了,只要你理解整数除法如何工作。但是,您必须自己编写更多的数学代码和帐户进行舍入。但这就是你想要的。你想要对舍入进行绝对控制。

答案 1 :(得分:3)

我将你的for循环更改为:

cout << (i+1) << "      $" << wage*52 << "\n";
wage = wage * (1+(raise/100.0));

它确实奏效了!我看到你不明白问题的语言。

答案 2 :(得分:2)

我认为目的是每年获得3%的加薪,但实际上每年只增加3%的起薪(在这种情况下为780美元)。您可能想要探索修改循环中每个传递的工资值(我不会提出解决方案,因为我怀疑这是一个家庭作业问题,是吗?)。

解决此类问题的最佳方法是在调试器中运行它并逐步查找每行,以查找结果与预期不符的情况。在这一点上通常很容易找出你的逻辑误入歧途的地方。

答案 3 :(得分:1)

你的问题是你的程序忽略了复合。您正在计算加价的美元价值,并将其用于每次加价。一旦你第一次加薪,你的第二次加薪的价值需要根据你的新工资计算,而不是你原来的工资。