Russian Qt Forum
Ноябрь 23, 2024, 17:49 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Округление в QDoubleSpinBox  (Прочитано 7109 раз)
Vladimir
Крякер
****
Offline Offline

Сообщений: 305



Просмотр профиля
« : Август 10, 2017, 17:55 »

Как можно избавиться от округления в QDoubleSpinBox?
Ввожу 222222222222222.2222, после потери фокуса -> 222222222222222.2187
Записан
ViTech
Гипер активный житель
*****
Offline Offline

Сообщений: 858



Просмотр профиля
« Ответ #1 : Август 10, 2017, 18:36 »

Это не округление, это точность представления. Похоже, в типе double нельзя точно выразить число "222222222222222.2222". И QDoubleSpinBox тут не при чём.
Записан

Пока сам не сделаешь...
Vladimir
Крякер
****
Offline Offline

Сообщений: 305



Просмотр профиля
« Ответ #2 : Август 10, 2017, 20:16 »

Это не округление, это точность представления. Похоже, в типе double нельзя точно выразить число "222222222222222.2222". И QDoubleSpinBox тут не при чём.

ну да, скорее всего дело в представлении double числа.. и от чего это точность зависит? от архитектуры процессора? (интересно, для общего пониманию Улыбающийся ). И тогда решением данной задачи будет хранить числа в тексте QLineEdit + писать всякие range и валидаторы к нему..?
Записан
ViTech
Гипер активный житель
*****
Offline Offline

Сообщений: 858



Просмотр профиля
« Ответ #3 : Август 11, 2017, 00:11 »

ну да, скорее всего дело в представлении double числа.. и от чего это точность зависит? от архитектуры процессора? (интересно, для общего пониманию Улыбающийся ).

Для описания чисел есть всякие стандарты, например IEEE 754-2008. Аппаратные и программные средства должны соответствовать заданным стандартам.

И тогда решением данной задачи будет хранить числа в тексте QLineEdit + писать всякие range и валидаторы к нему..?

Так сразу не могу сказать, можно попробовать хранить данные в типе "long double", но там тоже свои ограничения по точности представления. И нужно ещё убедиться, что функции преобразования из/в строку работают именно с "long double", а не преобразуют неявно в "double".

Вообще, в данном случае возможно требуется тип "decimal", как BigDecimal в Java. Но сейчас в стандарте С++ подобного типа нет, нужно шариться по 3rdparty библиотекам. Есть техническая спецификация Numbers TS, но до её внедрения в стандарт ещё дожить надо Улыбающийся.
Записан

Пока сам не сделаешь...
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Август 11, 2017, 06:43 »

ну да, скорее всего дело в представлении double числа.. и от чего это точность зависит? от архитектуры процессора? (интересно, для общего пониманию Улыбающийся ).
От кол-ва бит мантиссы, или, по-простому, от размера double (8 байт)

И тогда решением данной задачи будет хранить числа в тексте QLineEdit + писать всякие range и валидаторы к нему..?
Не все задачи нужно решать  Улыбающийся

Для понимания: int и float оба 4 байта, но float может хранить гораздо бОльшие значения. Почему? (вернее, за счет чего?). Очевидно float покрывает хранимый диапазон неравномерно, чем больше значения - тем больше и шаг между ними. Дешевый фокус
Код
C++ (Qt)
if (a == a + 1)  {  
// код здесь может сработать если a достаточно большое float или double
}
 
Так что все нормально, нужно умерить "хотелку"  Улыбающийся
Записан
Vladimir
Крякер
****
Offline Offline

Сообщений: 305



Просмотр профиля
« Ответ #5 : Август 11, 2017, 10:21 »

Не все задачи нужно решать  Улыбающийся

Так что все нормально, нужно умерить "хотелку"  Улыбающийся

Вот так тестерам и напишу)))

Igors,ViTech спасибо за пояснения!
Записан
deMax
Хакер
*****
Offline Offline

Сообщений: 600



Просмотр профиля
« Ответ #6 : Август 14, 2017, 07:30 »

Можете long double (12бит) использовать, правда вводить числа такой точности лучше не в ручную и компонент придется переделать Улыбающийся
Для красоты может добавить некое сообщение если строка изменилась об округлении.
Записан
Vladimir
Крякер
****
Offline Offline

Сообщений: 305



Просмотр профиля
« Ответ #7 : Август 15, 2017, 11:09 »

Можете long double (12бит) использовать, правда вводить числа такой точности лучше не в ручную и компонент придется переделать Улыбающийся
Для красоты может добавить некое сообщение если строка изменилась об округлении.

Я переопределял в QDoubleSpinBox метод QString textFromValue (double value) const для нужного мне отображения, а чтобы использовать long double тогда что надо будет переписать?
Записан
ViTech
Гипер активный житель
*****
Offline Offline

Сообщений: 858



Просмотр профиля
« Ответ #8 : Август 15, 2017, 13:57 »

Я переопределял в QDoubleSpinBox метод QString textFromValue (double value) const для нужного мне отображения, а чтобы использовать long double тогда что надо будет переписать?

Можно взять код QDoubleSpinBox и по его аналогии написать QLongDoubleSpinBox. Только сначала надо убедиться, что long double подходит для поставленных задач и имеются функции для работы с ним (различные преобразования и прочее).
Записан

Пока сам не сделаешь...
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.223 секунд. Запросов: 23.