如何以动态精度cout浮动/双精度?

时间:2015-08-14 16:26:35

标签: c++

#include <iostream>
#include <iomanip>

using namespace std;

int main() {
    float a = 3.14159;
    double b = 3.14159;
    cout.precision(6);
    cout << a << endl; //3.14159
    cout << b << endl; //3.14159
    cout.precision(10);
    cout << a << endl; //3.141590118
    cout << b << endl; //3.14159
    cout.precision(20);
    cout << a << endl; //3.141590118408203125
    cout << b << endl; //3.1415899999999998826
    return 0;
}

任何人都可以解释浮动和双重之间的区别吗? 我们如何以动态精度打印float / double?

3 个答案:

答案 0 :(得分:1)

假设我有动态正确的定义,这样的事情应该有效:

void print(float toPrint, int precision)
{
    cout.precision(precision);
    cout << toPrint <<endl;
}

cout.precision只会改变打印的精度,但实际上并不会影响数字的精确程度。如果您打印的数字超过数字的精度,则会得到不准确的数字。

当然,cout.precision也只会改变打印的最大精度。要强制它打印尾随零,请执行以下操作:

void print(float toPrint, int precision)
{
    cout.precision(precision);
    cout << fixed;
    cout << toPrint <<endl;
}

float和double之间的区别在于double的大小是float的两倍。通常,float具有7或8位精度,double具有15或16位精度。

答案 1 :(得分:0)

如果我正确地阅读了您的问题,您会想知道为什么floatdouble在您调整cout.precision后失去了精确度。

这是因为浮点数以二进制形式存储,而不是正常的整数。这很重要的一个常见示例是,0.6数字以二进制形式存储为0011111100101...。这与十进制的0.6666666...一样,是一个无限长的数字。因此,您的计算机需要决定它应该在什么位置舍入/接近该值。当您声明并初始化浮点数ab时,计算机知道它不需要将除3.14159之外的任何值填充到变量中。但是,当您更改cout.precision时,计算机认为需要在稍后的位置对浮点进行舍入。此外,floats仅为16位,因此它几乎总是不如double精确,即32位。请参阅here了解其范围。

显然,为了获得正确的精确度,您不应该将cout.precision调整为大于变量的位数。但是,如果要在初始变量值结束后调整精度并打印出一堆零,请使用cout << fixed << setprecision(number)。见下文:

#include <iostream>
#include <iomanip>

using namespace std;

int main() {
    float a = 3.14159;
    double b = 3.14159;
    cout.precision(6);
    cout << a << endl; //3.14159
    cout << b << endl; //3.14159
    cout << fixed << setprecision(10);
    cout << a << endl; //3.141590118
    cout << b << endl; //3.141590000
    return 0;
}

修改: Another option is to use limits.

答案 2 :(得分:-1)

拥有&#34;动态精度&#34;没有意义。其中显示与0不同的所有数字。该模式会出现具有无限小数位的小数的问题,例如1.0 / 3的结果。

您可以做的最好的事情是设置您希望使用precision看到的最大精度,就像您的示例中一样。