#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 знаков, как говорится, за глаза хватит... А то и меньше.
Комментариев нет:
Отправить комментарий