双C+的精度损失+; 我正在开发一个在Linux环境下运行的C++应用程序。我需要存储一个小数点后6位的大值。我使用了一个double,但是赋值后,它没有包含确切的值。四舍五入

双C+的精度损失+; 我正在开发一个在Linux环境下运行的C++应用程序。我需要存储一个小数点后6位的大值。我使用了一个double,但是赋值后,它没有包含确切的值。四舍五入,c++,C++,例: 但在这样做之后,每当我看到dValue的值时,它就像79447461534242.906 有人能告诉我为什么会发生这种情况,并建议我正确的数据类型,它可以保持准确的值而不损失任何精度。在典型的实现中,double的总精度约为15位。这些数字在小数点之前还是之后无关紧要,总共是15位数字 在您的情况下,原始数字约为20位,因此5位会立即丢失。C++使用IEEE浮点类型,这些类型在设计上仅精确到一定程度。如果需要任意精度,请查看eg或任何其他任意精度库。该库以53位精度存储数字。这给出了大约1

例:

但在这样做之后,每当我看到dValue的值时,它就像79447461534242.906


有人能告诉我为什么会发生这种情况,并建议我正确的数据类型,它可以保持准确的值而不损失任何精度。

在典型的实现中,
double
的总精度约为15位。这些数字在小数点之前还是之后无关紧要,总共是15位数字


在您的情况下,原始数字约为20位,因此5位会立即丢失。

C++使用IEEE浮点类型,这些类型在设计上仅精确到一定程度。如果需要任意精度,请查看eg或任何其他任意精度库。

该库以53位精度存储数字。这给出了大约16位十进制数字的精度

您可能会发现
long double
提供了更高的精度,但不能保证该精度大于
double


如果您需要比从本机类型获得的精度更高的精度,您将需要一个高精度的数字库,例如。

在linux上,您可以使用四精度浮点类型的uu float128。

别忘了接受您最喜欢的答案;)你确定总共15位的精度吗?至少在Javascript中,整数精度是准确的。。。但我不确定这是否是JavaScript独有的。@ MARCURRIMER:C++中的整数类型也是精确的;但这个问题是关于浮点类型的。@MarcusRiemer:
double
和integer是两种完全不同的动物。虽然“高级”语言通常支持任意精度整数,但C++通常是用硬件提供的——通常为16位短,32为int,长为32或64位,长为64。code>double通常是一种64位浮点类型,尾数为53位。Javascript只提供一个
number
类型,该类型始终在内部存储为浮点数字。但他们声称整数运算是精确的,这就是为什么我这么问。我知道C++有一个更…完成接近数字类型。@MarcusRiemer:典型的双精度浮点运算将在(大约)-2^53..2^53的范围内进行精确的整数运算。如果他们保持的精度超出了这个范围,那么他们必须使用不同的类型(可能是在软件中实现的,而不是直接在CPU中实现的)。它给出了错误“\uuufloat128”未在此范围内声明您使用的gcc版本是什么?键入
gcc--version
double dValue = 79447461534242.913072; //Assignement of value