当从一个大的铸造 uint64_t 值为 双重. 结果没有达到预期的效果。为什么会这样,有没有办法解决。我使用的是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;
}
输出结果如下。
var64 = 844421103279395000
varDouble = 844421103279394940.000000
A double
,假设它使用IEE754双精度表示,只能容纳53位精度。 A uint64_t
使用所有64位作为值位,这意味着有一些值可以准确地存储在一个 uint64_t
不能准确存储在 double
.
在您的例子中,844421103279395000的十六进制表示为 0BB7 FC84 FDCF D0B8
. 最接近的53位精度的值是 0BB7 FC84 FDCF D080
即十进制的844421103279394944。 这个值与显示的值很接近,其差异可能是由于 printf
处理书写重要数字。