如何计算值而不舍入它们?

时间:2015-09-25 23:09:14

标签: c++ rounding

如果我使用calc.exe计算0,703125 / 2,那么我得到0,3515625。但是,如果我在C ++中做同样的事情,那么我得到0,351563。我怎么能转过来?我需要完整的号码。

背景

我试图找出以下示例中的模式是否始终为9。

360° = 3+6+0 = 9
180° = 1+8+0 = 9
90° = 9+0 = 9
45° = 4+5 = 9
22.5° = 2+2+5 = 9
11.25° = 1+1+2+5 = 9
5.625° = 5+6+2+5 = 18 = 1+8 = 9
2.8125° = 2+8+1+2+5 = 18 = 1+8 = 9
1.40625 = 1+4+0+6+2+5 = 18 = 1+8 = 9
0.703125 = 0+7+0+3+1+2+5 = 18 = 1+8 = 9
0.3515625 = 0+3+5+1+5+6+2+5 = 27 = 2+7 = 9
0.17578125 = 0+1+7+5+7+8+1+2+5 = 36 = 3+6 = 9
...

我已为此编写the code,但由于C ++对值进行舍入,因此得到错误的结果。我该如何解决这个问题?

代码

#include<iostream>
#include<sstream>
#include<string>
#include<math.h>       /* pow */
using namespace std;

int checksum(int param)
{
    int sum = 0;


    while (param > 0)
    {
        int r1 = param % 10;
        sum += r1;
        param /= 10;
    }

    while (sum > 9) { sum = checksum(sum); } 

    return sum;
}

//This function just takes a double and separates it in two parts. 
//The part in front of the point, and the part behind the point.
//Then it calls my checksum function with both of them and gives the result.

int tesla(double param)
{

    int     front_part              = static_cast<int>(param);
    double  after_point_part        = param - front_part;

    ostringstream strs;  
    strs << after_point_part;
    string after_point_part_str = strs.str();


    int nachkomma_len = after_point_part_str.length()-1;

    after_point_part *= pow(10.00,nachkomma_len-1);

    strs.str("");                                                                                           //so leert man einen stringstream
    strs << after_point_part;
    after_point_part_str = strs.str();

    int after_point_part_int = stoi(after_point_part_str);

    int SUM = 0;

    SUM = checksum(front_part);
    SUM += checksum(after_point_part_int);
    SUM = checksum(SUM);

    return SUM;
}



int main()
{
    double number; 
    cout<<"Enter number:"<<endl;
    cin>> number;

    int zähler = 100;

    for(int i=0; i < zähler; i++)
    {
        int erg = tesla(number);
        cout<<"The checksum of "<<number<<" is "<< erg <<endl;  
        number /= 2;
    }

    cin.get(); cin.get();
    return 0;
}

2 个答案:

答案 0 :(得分:2)

这里有很多事情要发生:

  • 您看到的数字是为了您的享受(或许是您的挫败感)。如果要查看比默认值更好的精度,请指定要查看比默认值更好的精度。如何打印数字以及如何表示它是两个截然不同的事情。

  • 如果您想要超过六位左右的精度小数,则需要使用双精度。如果你想要超过十五个左右的小数精度,你需要使用某种扩展精度。

  • 最终,没有逃脱。完全代表有理数,需要一台具有无限记忆的计算机。您无法在有限二进制(或数字)计算机上详细表示其有效性。

  • 完全代表实际数字是不可能的。实数的数量是不可数的。

答案 1 :(得分:2)

无需计算任何东西。任何可被9整除的数字都可以将其数字的总和除以9(https://sites.google.com/site/mathematicsnotebook/divisibilityrules/divisibility9

360可被9整除,除以2且计数位相当于乘以5:360/2 = 360 * 0.5,乘以10得到小数点左边的所有数字。

所以无论你除以2多少次,得到的数字都可以被9整除。所以它是数字之和,也就是数字之和。