Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > [Qt] Точная конвертация QString в double


Автор: wester 4.11.2010, 00:05
Доброго времени суток.
возникла проблема, как можно перевести QString в double точно, без изменений.
поясню 
Код

QString lastPart = "0.49";
double dlastPart = lastPart.ToDouble() // записывается 0.48999999999999999 

а как можно сделать что бы в переменную dlastPart записалось 0.49 ?

Автор: null56 4.11.2010, 04:26
double - это число двойной точности, проблема не в QString, а в том, как организована работа с вещественными типами в комьютере
попробуй сделай вот так вот и посмотри чего произойдет
Код

double val = 0.49;


Автор: borisbn 4.11.2010, 11:09
Код

    double d = 0.49;
    unsigned long long * x = (unsigned long long *)(&d);
    printf( "d = %.20f x = %I64X\n", d, *x );
    *x = *x + 1;
    printf( "d = %.20f x = %I64X\n", d, *x );
    *x = *x - 2;
    printf( "d = %.20f x = %I64X\n", d, *x );


*x - двоичное представление числа d

вот, что выводится:
Цитата

d = 0.48999999999999999000 x = 3FDF5C28F5C28F5C
d = 0.49000000000000005000 x = 3FDF5C28F5C28F5D
d = 0.48999999999999994000 x = 3FDF5C28F5C28F5B


таким образом, получается, что просто не существеут двоичного представления для числа 0.49

Автор: wester 4.11.2010, 16:50
null56, 
borisbn, 
тогда объясню для чего я это делаю.

мне необходимо перевести десятичное число в 16 ,2 или 8 систему счисления.
то есть 0.49 нужно что бы получить 0.01111 в двоичной С.С.

есть какой - то способ без придумывания велосипедов ?

Автор: wester 5.11.2010, 17:35
http://forum.vingrad.ru/forum/act-ST/f-143/t-314333/unread-1.html
разместил в ЦП тему. 
пожалуй, помечу эту тему как "решено"

Автор: borisbn 6.11.2010, 09:36
wester, неохота прыгать из темы в тему, тем более, что ты её разместил не в ЦП smile
Лови
Код

QString double_2_string( double d, int precision, int base, QChar separator = QChar( '.' ) )
{
    QString result = QString::number( (int)d, base );
    if ( precision == 0 )
    {
        return result;
    }
    d = d - (int)d;
    result = result + separator;
    for ( int i = 0; i < precision; i++ )
    {
        d *= base;
        result = result + QString::number( (int)d, base );
        d = d - (int)d;
    }
    return result;
}

...

qDebug() << double_2_string( 0.49, 9, 2 );


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)