#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?
答案 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)
如果我正确地阅读了您的问题,您会想知道为什么float
和double
在您调整cout.precision
后失去了精确度。
这是因为浮点数以二进制形式存储,而不是正常的整数。这很重要的一个常见示例是,0.6
数字以二进制形式存储为0011111100101...
。这与十进制的0.6666666...
一样,是一个无限长的数字。因此,您的计算机需要决定它应该在什么位置舍入/接近该值。当您声明并初始化浮点数a
和b
时,计算机知道它不需要将除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;
}
答案 2 :(得分:-1)
拥有&#34;动态精度&#34;没有意义。其中显示与0
不同的所有数字。该模式会出现具有无限小数位的小数的问题,例如1.0 / 3
的结果。
您可以做的最好的事情是设置您希望使用precision
看到的最大精度,就像您的示例中一样。