为什么"2 ="输出会给出惊喜结果,请稍微说清楚.在这种情况下,double有什么问题.
双值分割的任何约束.
在c ++中是否有任何选项可以避免这些事情.
#include<iostream.h>
#include<iomanip.h>
#include<math.h>
int main()
{
double d1,d2,d3,d4,d5;
double d = 0.010000;
d1 = 1000000.28;
d2 = 10000000.28;
d3 = 100000000.28;
d4 = 1000000000.28;
d5 = 10000000000.28;
cout.precision(15);
cout<<"1="<<floor(d1/d)<<endl;
cout<<"2="<<floor(d2/d)<<endl;
cout<<"3="<<floor(d3/d)<<endl;
cout<<"4="<<floor(d4/d)<<endl;
cout<<"5="<<floor(d5/d)<<endl;
return 0;
}
o/p
====
1 = 1000000.28;
2 = 10000000.27;
3 = 100000000.28;
4 = 1000000000.28;
5 = 10000000000.28;
Run Code Online (Sandbox Code Playgroud)
首先,程序的输出与您在问题中写的不同.输出是:
1=100000028
2=1000000027
3=10000000028
4=100000000028
5=1000000000028
Run Code Online (Sandbox Code Playgroud)
不:
1 = 1000000.28;
2 = 10000000.27;
3 = 100000000.28;
4 = 1000000000.28;
5 = 10000000000.28;
Run Code Online (Sandbox Code Playgroud)
第二,当你写的时候double d = 0.010000,d没有设置为.01.它被设置为一个可以表示为a的接近值double.(在一个好的C++实现中,它被设置为最接近的可表示值.)在C++实现中,double很可能是IEEE-754 64位二进制浮点值,与.01最接近的可表示值是0.01000000000000000020816681711721685132943093776702880859375.
同样,写入时d2 = 10000000.28,d2未设置为10000000.28.最接近的可表示值为10000000.27999999932944774627685546875.
当你划分这些数字时,你会得到一个近似但略小于1000000028的数字.除法的结果(舍入为a double)为1000000027.99999988079071044921875.当你采用floor那个时,分数被截断,留下1000000027.
避免或处理这些问题需要了解浮点运算以及您要执行的特定计算.在这种情况下,我们需要知道您要使用的原因floor.