A double
, при условии, что он использует представление двойной точности IEE754, может содержать только 53 бита точности. A uint64_t
использует все 64 бита как биты значения, что означает, что есть некоторые значения, которые могут быть сохранены точно в uint64_t
, но не могут быть сохранены точно в double
.
В вашем примере 844421103279395000 имеет шестнадцатеричное представление 0BB7 FC84 FDCF D0B8
. Ближайшее значение с точностью 53 бита - 0BB7 FC84 FDCF D080
, что составляет 844421103279394944 в десятичном формате. Это значение близко к отображаемому, но разница, вероятно, связана с тем, как printf
обрабатывает ввод значащих цифр.