当它不应该是C ++时,答案就是四舍五入

时间:2017-02-01 23:44:15

标签: c++ rounding-error

#include <iostream>
#include <cmath>
#include <iomanip>
#include <string>
using namespace std;

int main()
{
//Declaration of Variables
    float TotalCollected; // Total Amount Collected from sales
    double sales; // Sale excluding tax
    float CountyTaxRate; // Tax rate for County
    float StatesTaxRate; // Tax rate for state

    cout << setprecision(2) << fixed << showpoint;

//We get data from the user
    cout << "What is the Total Collected Amount? ";
    cin >> TotalCollected;
    cout << "What is the County Tax rate? "; 
    cin >> CountyTaxRate;
    cout << "What is the State Tax rate ";
    cin >> StatesTaxRate;

//Calculations
    sales = TotalCollected / (1 + StatesTaxRate + CountyTaxRate); 

//Output    
    cout << "Sales: $" << sales << endl;
    return 0;
}

县税率= .02州税率= .04
总收集金额= 26572.89

输出应该是25068.76,但我一直得到25068.77。

2 个答案:

答案 0 :(得分:1)

说实话,您遇到的问题是您使用的是float类型,而不是double。实际上,这会导致您的十进制值不太精确。

如果我在不改变数据类型的情况下将精度设置为3,那么我得到的数字是:25068.765。但是,如果我将数据类型更改为double并将精度保持为3,那么我得到的数字为25068.764。

现在给出2个浮点值,我们可以预期存储在double类型变量中的那个值是正确的数字。

因此,您应将变量的数据类型设置为double NOT float。这应该可以解决手头的问题。

希望这有帮助。

答案 1 :(得分:1)

使用浮点数进行高精度算术可能不是一个好主意,而32位float尤其糟糕。它的精度仅为24位,大致为6到7位十进制数。此外,如果您对浮点数执行某些算术运算(例如除法),结果将更加精确。

因此,如果您想保持简单,请使用double。它提供大约53位的精度,可以代表大约16到17个十进制数字。

或者稍微好一点使用像long long这样的整数类型并将其视为美分。整数算术更加精确和可预测。

最后,您可以随时使用高精度库,但我认为doublelong long对您来说已经足够了。