Страницы

Поиск по вопросам

воскресенье, 8 марта 2020 г.

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

#cpp #qt


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

Реализую проект на 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+$"));
}


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


Ответы

Ответ 1



Я в своё время нашёл только один удобный выход из этой ситуации. Нужно реализовать собственный алгоритм деления числителя на знаменатель "уголком", как в школе, выводя одну десятичную цифру результата за другой. Получив строку нужной длины из цифр после запятой, удаляем нули на конце. Код такой функции предельно прост (псевдокод, из головы): 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 вам нужно что-то другое, например, сохранение цифр в строку или что вы там собираетесь делать, я не знаю.

Ответ 2



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

Комментариев нет:

Отправить комментарий