cout.setf(IOS ::固定| IOS :: showpoint);设定精度超过原始数量

时间:2016-05-08 17:09:29

标签: c++

    #include <iostream>
#include <iomanip>
using namespace std;

int main()
{
    float f = 17793.03;
    cout.setf(ios::fixed|ios::showpoint);
    cout<<setprecision(3);
    cout<<f<<endl;
}

结果 17793.029

我曾经使用过Python,但我不知道为什么会这样。 感谢

2 个答案:

答案 0 :(得分:0)

可能因为数字17793.03无法编码,所以编译器将其舍入为最接近的可编码浮点数。试试双重

[EDIT] float以32位编码,64位加倍。因此它们具有“双精度”,因此更精确

答案 1 :(得分:0)

在C ++中,浮点文字默认为double类型。 如果您这样做:

float f = 17793.03; // implicit type conversions happen, 17793.03 is a double

您正在为浮点运算一个double,这可能会导致精度损失,也可能不会导致精度损失,编译器会显示警告。
如果需要float类型的浮点字面值,则必须使用后缀f或F. 编译器不能只将表示值17793.03的位复制到float f中。相反,它需要将双17793.03转换为浮点数。

你可能想要这个:

float f {17793.03F}; //float values typically have 7 digits of precision
cout << std::fixed << std::setprecision(2) << f << std::endl; 
// Result: 17793.03

如果您需要更高的精确度,请使用双打:

double d {17793.03}; // typically have 16 digits of precision   
cout << std::fixed << std::setprecision(3) << d << endl;
// Result: 17793.030

现在这里有一个有趣的事情:在引擎盖下,Python浮点类型是双倍的。