9

我正在开发一个在 linux 环境下运行的 C++ 应用程序。我需要存储一个小数点后 6 位的大值。我为此使用了双精度,但是在分配它之后,它不包含确切的值。它被四舍五入。

前任:

double dValue = 79447461534242.913072; //Assignement of value

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

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

4

4 回答 4

8

在典型的实现中, a的double精度大约为 15 位。小数点之前还是之后都没有关系,总共只有15位。

在您的情况下,原始号码约为 20 位,因此立即丢失了 5 位。

于 2012-08-23T17:15:44.920 回答
6

C++ 使用 IEEE 浮点类型,这些浮点类型只能在设计上达到一定程度。如果您需要任意精度,请查看例如GNU MP Bignum或任何其他任意精度库。

于 2012-08-23T17:16:45.590 回答
2

在 linux 上,您可以使用 __float128 ,它是一种四精度浮点类型。

于 2012-08-23T17:21:39.677 回答
2

常用的双精度格式以 53 位精度存储数字。这给出了大约 16 位十进制数字的精度。

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

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

于 2012-08-23T17:19:01.250 回答