Страницы

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

воскресенье, 26 мая 2019 г.

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

Здравствуйте!
Реализую проект на 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+$")); }
Прошу вашей помощи, заранее благодарю.


Ответ

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

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

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