Как получить нужную точность при умножении и делении чисел типа double?
Имеется два числа типа double - значение поля и множитель\делитель. Например, пользователь пишет 4,2 в поле ввода, это число умножается на множитель равный 10 или делиться на делитель равный 0,1, а затем переводится в целочисленный формат для отправки на другое устройство. Протокол воспринимает только целые числа, а вот значения физических величин, стоящих за этими значения могут иметь десятые и сотые доли, поэтому приходится хранить переменную делитель\множитель, чтобы показывать пользователю "4,2 В", а не "42 В".
Однако, столкнулся с интересной особенностью, которую не могу разрешить. При умножении, например 4,2*10 получаю 42, а 4,3*10 = 43 - всё логично и нормально. Но если я преобразую ответ из double в uint, то получаю два равных ответа - 42.
Переключая значения - заметил, что нечётные округляются до чётных в меньшую сторону. 8.1 -> 8.0 и т.д. Как можно решить? Точность выше двух знаков после запятой не требуется.
p.s. пишу на Qt, т.е. вместо uint использую quint16
Умножайте на 10 перед переводом и делите на 10 после. Как костыль.
А вообще, точность и double несовместимы. Хотите точности - уберите double вовсе, работайте только с "копейками".
Илья Житенёв, вы же от пользователя получаете не double, а строку.
Не так уж трудно определить, где у нее дробная часть, и привести результат к "копейкам".
Дело в том, что 4,2 и 4,3 невозможно представить в виде double. И система, например, сохраняет 4,3 в виде 4,2999999, которое при умножении на 10 станет 42,999999.
Нужно убедиться, что при преобразовании double → int происходит round, а не усечение.
Борьба с неточностями вещественной математики в прикладном программировании, как правило, вообще не требуется. Потому что реально все эти десятичные дроби требуются только на вводе и выводе.