设置一个双精度不使用流(的ios_base ::精度)(Setting the precision

2019-06-28 03:25发布

有没有办法做到这一点不使用流? 例如,这样的事情:

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

代替:

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

我是新的C ++和我很好奇。 提前致谢。

Answer 1:

double s如上几乎普遍实施IEEE浮点数 。 其精度取决于数量大小只(在的情况下double ,这是短期的“ 双精度浮点数 ”,它是53位)。 没有手动设置浮点数的精度方式。

显示精度总是输出格式的特性,从未的数目。 不要试图通过四舍五入更改号码,操作是没有意义的。 你并不需要减少一些的精度,除了显示目的。



Answer 2:

我已经修改了代码,考虑到@约翰,@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


Answer 3:

一个double总是具有相同的内部精密(二进制精度最有可能53位),无论你做什么。 写出兼作十进制格式的文本,你可以控制输出的数字精度当而已。 所以,不,你不能比它的原生精密(让一旁的十进制精度)设置一个二进制双精度数与别的精度。

如果你想要的是圆一个数的小数位数给定数量,然后咨询菲利普的回答(但与约翰康拉德在他们的评论作出当然ammendments)。 但是请注意,这不会改变底层的类型的preicision与这个数字所有计算将在二进制双精度进行。 还这样的圆形十进制数并不需要在底层二进制浮点类型完全表示。

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



文章来源: Setting the precision of a double without using stream (ios_base::precision)