不使用流设置double的精度(ios_base :: precision)

时间:2012-09-10 09:58:49

标签: c++ double precision

有没有办法在不使用流的情况下执行此操作?例如,像这样:

double a = 6.352356663353535;
double b = a.precision(5);

而不是:

double a = 6.352356663353535;
std::cout.precision(5);
std::cout << a << std::endl;

我是C ++的新手,我很好奇。提前谢谢。

3 个答案:

答案 0 :(得分:5)

考虑到@john,@ Konrad和@ KennyTM的建议,我修改了代码。我检查它是否与负数一起使用。

#include <cmath>
#include <cstdio>
using namespace std;
int main()
{
   double a = 6.352356663353535;
   double  intpart;
   double fractpart = modf (a, &intpart);
   fractpart  = roundf(fractpart * 100000.0)/100000.0; // Round to 5 decimal places
   double b = intpart + fractpart;
   printf("%.5lf", b);
}

输出

6.35236

答案 1 :(得分:5)

double几乎普遍实施为IEEE floating point numbers。它们的精度仅取决于数字大小(在double的情况下,它是“double-precision floating point number”的缩写,它是53位)。无法手动设置浮点数的精度。

显示精度始终是输出格式的属性,绝不是数字的属性。不要试图通过舍入来改变数字,操作毫无意义。除了显示之外,不需要来降低数字的精度。

答案 2 :(得分:0)

无论你做什么,double总是具有相同的内部精度(最可能是53位的二进制精度)。只有在以小数形式写出double作为文本时,才能控制输出的小数精度。所以不,你不能将二进制双精度数的精度设置为除了它的原始精度之外的其他任何东西(放弃小数精度)。

如果你想要的只是将一个数字四舍五入到给定的十进制数字,那么请参考 Phillip 的答案(但是 john 的修正案Konrad 当然是在评论中提出的。但请注意,这不会更改基础类型的精确度,并且具有此数字的所有计算将以二进制双精度执行。此类舍入的十进制数也不需要在底层二进制浮点类型中精确表示。

如果你真的想要执行精确的十进制算术,那么你必须寻找提供实际十进制浮点类型的第三方库。