Как корректно вывести дробное число?

783
15 января 2017, 16:30

Здравствуйте!

Реализую проект на Qt. Пытаюсь вывести дробь, знаменатель которой не является степенью двойки (19 знаков после запятой). Например, 1/5 = 0,2000000000000000111.

Понятно, что такой вид - особенность представления чисел с плавающей точкой в C++. Но как вывести доступный для пользователя результат (1/5 = 0,2)? Формат вывода желательно не менять.

Пользуюсь следующим методом для вывода числа.

QString MainWindow::numberFormat(const double &number)
{
    QString str = QLocale::system().toString(number, 'f', 21);
    return str.remove(QRegExp(",?0+$"));
}

Прошу вашей помощи, заранее благодарю.

Answer 1

Ну прочтите документацию - вы же пытаетесь вывести 21 знак (toString(number, 'f', 21)). Зачем? Уберите точность вывода до реальной. Думаю, предлагаемых по умолчанию 6 знаков, как говорится, за глаза хватит... А то и меньше.

Answer 2

Я в своё время нашёл только один удобный выход из этой ситуации. Нужно реализовать собственный алгоритм деления числителя на знаменатель "уголком", как в школе, выводя одну десятичную цифру результата за другой. Получив строку нужной длины из цифр после запятой, удаляем нули на конце.

Код такой функции предельно прост (псевдокод, из головы):

void div (unsigned int num, unsigned int denom, size_t n) {
    printf ("%u,", num/denom);  // Целая часть
    num %= denom;   // Дробная часть.
    while (n-- > 0) {  // n - сколько нужно цифр.
        num *= 10;
        unsigned int d = num/denom;
        printf ("%u", d);
        num -= d*denom;
    }
}

Разумеется, вместо printf вам нужно что-то другое, например, сохранение цифр в строку или что вы там собираетесь делать, я не знаю.

READ ALSO
Горизонтальный ScrollBar в QTreeView

Горизонтальный ScrollBar в QTreeView

Как можно включить отображение горизонтального ScrollBar в QTreeView с фиксированной шириной при выходе названия ветки за границы view'шки?

457
SQL выборка по дате

SQL выборка по дате

Пишу запрос на выборку ТОП-10 покупателейВывести покупателей за все время я смог запросто, но встал вопрос о сортировке по дате

379
Как сделать, чтобы DrawerLayout был поверх ActionBar?

Как сделать, чтобы DrawerLayout был поверх ActionBar?

Как сделать так, чтобы выдвижная панель выезжала на всю высоту экрана (высоту, а не ширину, с шириной все ясно)Я имею ввиду, чтобы она заезжала...

315
Деплой мавен проекта на томкэт

Деплой мавен проекта на томкэт

При деплое через консоль mvn tomcat7:deploy - все успешно, но когда я нажимаю в intellij idea на деплой выдает этоПолдня мучаюсь

457