Как получить точное входное значение double в QDoubleSpinBox?

Мне нужно получить точное входное значение двойного спин-бокса. Я установил 8 десятичных цифр для своего Spinbox. Когда я набираю 0,6000000, в отладке я получаю 0,59999999999998, как на картинке (иногда это 0,6000000000002).

pic1

Я попытался преобразовать это значение в 0,60000000, используя QString::number, и снова преобразовать его в двойное число. Я снова получаю старое значение (0,59999999999998).

введите здесь описание изображения Но когда я распечатываю эти значения, я печатаю 0,60000000.

Потому что после этого у меня есть расчет, поэтому мне нужно точное входное значение, иначе мой расчет будет неправильным. В этом случае я должен стать точным 0,60000000). Как я могу это сделать?


person songvan    schedule 09.04.2019    source источник
comment
Возможный дубликат Не работает математика с плавающей запятой?   -  person TrebledJ    schedule 09.04.2019
comment
@TrebledJ: спасибо, проблема может быть та же, но у меня до сих пор нет решения для этого случая :)   -  person songvan    schedule 09.04.2019
comment
Я предполагаю, что вы будете использовать input double в какой-то арифметике и вычислениях? Возможно, вы захотите взглянуть на C++, вычисляющий более точно, чем double или длинный двойной. В противном случае, вероятно, лучше использовать вместо этого строки и редактирование строк (но, похоже, это не то, чего вы пытаетесь достичь).   -  person TrebledJ    schedule 09.04.2019
comment
Ах, хорошо, перечитайте свой вопрос о необходимости точного значения. Для точности вам может понадобиться загрузить другую библиотеку (например, библиотеку GNU Multiprecision, рекомендованную в Десятичный тип в также Qt (C++)). Я думаю, что у Boost также есть библиотека с высокой точностью для математики?   -  person TrebledJ    schedule 09.04.2019
comment
@TrebledJ: спасибо за помощь. Я попробовал использовать собственное решение QString valueAsText = locale().toString( p_value, 'f', decimals() );. Я получил valueAsText точно так, как я набрал. Из этого я могу получить целую часть и десятичную часть (используя строку), а затем снова преобразовать в int. и это работает :)   -  person songvan    schedule 09.04.2019
comment
Корень проблемы в том, что вы пытаетесь представить десятичное число с плавающей запятой на компьютере, который мыслит двоичным числом с плавающей запятой. 0.6 не может быть идеально представлен в двоичном формате с плавающей запятой. Самое близкое, что вы можете получить, будет 0,1001 (повторяется). Он немного меньше, но чем дальше, тем ближе. См. преобразователь десятичной системы в двоичную и Почему 1.1 + 2.2 != 3.3?.   -  person jwernerny    schedule 09.04.2019