如果我使用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;
}
答案 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整除。所以它是数字之和,也就是数字之和。