从 uint64_t 转换为 double 会导致值不正确

Eng*_*999 1 c double casting type-conversion uint64

当从大的uint64_t值转换为double时。结果并不如预期。这是为什么,有办法解决吗。我正在使用 gcc 8.3.0

int main
{
   uint64_t var64 = 844421103279395000;

   printf("var64     = %llu\n", var64 );

   double varDouble = (double)var64;

   printf("varDouble = %lf\n", varDouble );

   return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出如下:

var64     = 844421103279395000
varDouble = 844421103279394940.000000
Run Code Online (Sandbox Code Playgroud)

dbu*_*ush 5

A double,假设它使用 IEE754 双精度表示,只能保存 53 位精度。Auint64_t使用所有 64 位作为值位,这意味着有些值可以精确存储在 a 中uint64_t,但不能精确存储在 a 中double

\n\n

在您的示例中,844421103279395000 的十六进制表示形式为0\xe2\x80\xadBB7 FC84 FDCF D0B8\xe2\x80\xac。具有 53 位精度的最接近值是0\xe2\x80\xadBB7 FC84 FDCF D080十进制的 \xe2\x80\xad844421103279394944\xe2\x80\xac 。该值接近显示的值,差异可能是由于printf处理写入有效数字的方式造成的。

\n