Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Vladimir от Август 10, 2017, 17:55



Название: Округление в QDoubleSpinBox
Отправлено: Vladimir от Август 10, 2017, 17:55
Как можно избавиться от округления в QDoubleSpinBox?
Ввожу 222222222222222.2222, после потери фокуса -> 222222222222222.2187


Название: Re: Округление в QDoubleSpinBox
Отправлено: ViTech от Август 10, 2017, 18:36
Это не округление, это точность представления. Похоже, в типе double нельзя точно выразить число "222222222222222.2222". И QDoubleSpinBox тут не при чём.


Название: Re: Округление в QDoubleSpinBox
Отправлено: Vladimir от Август 10, 2017, 20:16
Это не округление, это точность представления. Похоже, в типе double нельзя точно выразить число "222222222222222.2222". И QDoubleSpinBox тут не при чём.

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


Название: Re: Округление в QDoubleSpinBox
Отправлено: ViTech от Август 11, 2017, 00:11
ну да, скорее всего дело в представлении double числа.. и от чего это точность зависит? от архитектуры процессора? (интересно, для общего пониманию :) ).

Для описания чисел есть всякие стандарты, например IEEE 754-2008 (https://ru.wikipedia.org/wiki/IEEE_754-2008). Аппаратные и программные средства должны соответствовать заданным стандартам.

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

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

Вообще, в данном случае возможно требуется тип "decimal", как BigDecimal (https://docs.oracle.com/javase/7/docs/api/java/math/BigDecimal.html) в Java. Но сейчас в стандарте С++ подобного типа нет, нужно шариться по 3rdparty библиотекам. Есть техническая спецификация Numbers TS (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/p0101r0.html), но до её внедрения в стандарт ещё дожить надо :).


Название: Re: Округление в QDoubleSpinBox
Отправлено: Igors от Август 11, 2017, 06:43
ну да, скорее всего дело в представлении double числа.. и от чего это точность зависит? от архитектуры процессора? (интересно, для общего пониманию :) ).
От кол-ва бит мантиссы, или, по-простому, от размера double (8 байт)

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

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


Название: Re: Округление в QDoubleSpinBox
Отправлено: Vladimir от Август 11, 2017, 10:21
Не все задачи нужно решать  :)

Так что все нормально, нужно умерить "хотелку"  :)

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

Igors,ViTech спасибо за пояснения!


Название: Re: Округление в QDoubleSpinBox
Отправлено: deMax от Август 14, 2017, 07:30
Можете long double (12бит) использовать, правда вводить числа такой точности лучше не в ручную и компонент придется переделать :)
Для красоты может добавить некое сообщение если строка изменилась об округлении.


Название: Re: Округление в QDoubleSpinBox
Отправлено: Vladimir от Август 15, 2017, 11:09
Можете long double (12бит) использовать, правда вводить числа такой точности лучше не в ручную и компонент придется переделать :)
Для красоты может добавить некое сообщение если строка изменилась об округлении.

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


Название: Re: Округление в QDoubleSpinBox
Отправлено: ViTech от Август 15, 2017, 13:57
Я переопределял в QDoubleSpinBox метод QString textFromValue (double value) const для нужного мне отображения, а чтобы использовать long double тогда что надо будет переписать?

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