Здравствуйте!
Реализую проект на 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 вам нужно что-то другое, например, сохранение цифр в строку или что вы там собираетесь делать, я не знаю.
Комментариев нет:
Отправить комментарий