我正在开发一个在linux环境下运行的C ++应用程序。我需要存储6个deciaml位置的大值。我用了一个双。但是在赋值之后,double变量不包含确切的值。它完善了。
例如:
double dValue = 79447461534242.913072; //Assignement of value
但在那之后,当我看到dValue中的值时,它就像79447461534242.906
有人可以让我知道为什么会这样,并建议我使用正确的数据类型,它可以保持精确值而不会丢失精度。
答案 0 :(得分:6)
在典型的实现中,double
具有大约15位精度总计。无论是小数点之前还是之后都没关系,它总共只有15位数。
在您的情况下,原始号码大约是20位数,因此会立即丢失5位数。
答案 1 :(得分:6)
C ++使用的IEEE浮点类型只能在某种程度上精确按设计。如果您需要仲裁精度,请查看例如GNU MP Bignum或任何其他仲裁精度库。
答案 2 :(得分:2)
most commonly used double precision format以53位精度存储数字。这给出了大约16位精度的十进制数字。
您可能会发现long double
提供更高的精确度,但无法保证其大于double
。
如果您需要比本机类型更高的精度,则需要一个高精度数字库,例如GMP。
答案 3 :(得分:1)
在linux上你可以使用__float128这是一种四倍精度浮点类型。