为什么c++将一个超过6位小数的双精度体增加到下一个十进制数,而不实际改变值?



为什么会发生这种行为?在double中,第6位之后的小数点自增到下一位,但在转换为int时不自增。

它在转换为int时导致问题,因为尽管输出3,d1在转换为整数时仍然转换为2,而不是3

double d1 = 2.999999; //6 digits after decimal
double d2 = 2.777777;

double d3 = 2.77777;  //5 digits after decimal
double d4 = 2.99999;  

cout<<d1<<endl;       //gives 3
cout<<(int)d1<<endl;  //still gives 2 not 3
cout<<d2<<endl;       //gives 2.777778

cout<<d3<<endl;       //gives 2.77777 as expected
cout<<d4<<endl;       //gives 2.99999 as expected

我假设它必须与编译器或精度做一些事情,但我不确定这种意外行为。请帮助

这是因为cout的默认精度是6。编译器可以准确地识别所有的值,但是输出被四舍五入到小数点后6位。如果想要确切的结果,可以这样修改代码:

cout << setprecision(7);
double d1 = 2.999999; //6 digits after decimal
double d2 = 2.777777;
double d3 = 2.77777;  //5 digits after decimal
double d4 = 2.99999;  
cout<<d1<<endl;       //gives 2.999999
cout<<(int)d1<<endl;  //still gives 2 not 3
cout<<d2<<endl;       //gives 2.777777
cout<<d3<<endl;       //gives 2.77777 as expected
cout<<d4<<endl;       //gives 2.99999 as expected

相关内容