Search code examples
c++qtqtcore

Why does qjsonvalue todouble conversion cause data loss?


QJsonValue toDouble() conversion generates wrong values causing data loss.

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


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

qDebug ()  << ul << ul2;

Output:

73183493944884960 73183493944884961

Solution

  • toDouble() means it returns a double (that you cast to qulonglong then) which is inherently a precision loss. You can easily figure this out without involving json into this, by printing out this:

    main.cpp

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

    Building (something similar)

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

    Output

    73183493944884960