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