为什么 C++ 将超过 6 位小数的双精度数递增到下一个十进制数,而不实际更改该值?

Shi*_*ngh 3 c++ floating-point types

为什么会发生这种行为?第六位之后的小数在 double 中递增到下一位,但在转换为 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
Run Code Online (Sandbox Code Playgroud)

我假设它必须与编译器或精度有关,但我不确定这种意外行为。请帮忙

小智 5

这是因为 的默认精度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
Run Code Online (Sandbox Code Playgroud)