Почему qjsonvalue toдвойное преобразование приводит к потере данных?

Преобразование QJsonValue toDouble() генерирует неправильные значения, что приводит к потере данных.

QJsonObject obj;
obj.insert("dbl",double(73183493944884961));


double d = obj.value("dbl").toDouble();
qulonglong ul = d;
qulonglong ul2 = 73183493944884961;

qDebug ()  << ul << ul2;

Выход:

73183493944884960 73183493944884961

person Ashish    schedule 06.10.2013    source источник


Ответы (1)


toDouble() означает, что он возвращает двойное значение (которое вы затем приводите к qulonglong), что по своей сути является потерей точности. Вы можете легко понять это, не привлекая к этому json, распечатав это:

main.cpp

#include <QDebug>

    int main()
    {
        qulonglong ul2 = double(73183493944884961);
        qDebug() << ul2;
        return 0;
    }

Здание (что-то похожее)

g++ -fPIC -I/usr/include/qt -I/usr/include/qt/QtCore -lQt5Core main.cpp && ./a.out

Выход

73183493944884960
person lpapp    schedule 06.10.2013
comment
@Ashish: попробуйте 145241087982812481. - person lpapp; 06.10.2013
comment
@Ashish: QString QString::number (двойной n, формат char = 'g', точность int = 6) [статические] - person lpapp; 06.10.2013
comment
Почему ты решил, что сможешь это сделать? Это не связано с Qt, если вы попытаетесь применить его таким образом в C/C++, вы по своей сути потеряете точность. См. пример выше. Кроме того, вы можете просто сохранить значение как строку. - person lpapp; 06.10.2013