A solução flutuante Decimal64 é a melhor, mas requer alguma mágica de programação com uniões anônimas. Para converter decimal64 para std :: string, você tem que usar uma união (suponha que ele tenha o nome S) com 2 membros, uma entrada decimal :: decimal64 e uma saída uint64_t (do c ++ 99's cstdint.h). Como essa união tem um membro decimal :: decimal64 que é uma classe C ++ e requer um construtor e um destruidor definidos pelo usuário, é necessário usar o novo operador de posicionamento para definir o valor do membro de entrada e causar uma alteração no valor do membro de saída.
Além disso, o programador deve inicializar o objeto S, por exemplo, dados nomeados, como este: S data = {12345678987654321ULL} para que o compilador não exclua o objeto union nos bastidores. Para complicar mais as coisas, decimal / decimal.h, não define o construtor embutido, decimal64 :: decimal64 em linha (decimal64 __r). Finalmente, o usuário precisa escrever um operador global de ostream < < para decimal64.
Para simplificar a vida para mim, hoje usei uint64_t para representar o número de nanossegundos do Windows Epoch hoje. Essa opção corrigiu meus erros de estouro numérico int64_t.
A desvantagem entre o uint64_t e o decimal64 é que o decimal64 tem um intervalo dinâmico muito maior que o uint64_t. Além disso, printf de uint64_t requer um especificador de formato especial:
#include <inttypes.h>
uint64_t t;
printf("%" PRIu64 "\n", t);
Por favor, deixe-me saber se você tiver dúvidas ou precisar de um exemplo de código.