ilyazh
@ilyazh
Инженер-испытатель ЭКБ

Как получить нужную точность при умножении и делении чисел типа 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
  • Вопрос задан
  • 133 просмотра
Решения вопроса 1
@Mercury13
Программист на «си с крестами» и не только
Дело в том, что 4,2 и 4,3 невозможно представить в виде double. И система, например, сохраняет 4,3 в виде 4,2999999, которое при умножении на 10 станет 42,999999.
Нужно убедиться, что при преобразовании double → int происходит round, а не усечение.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через TM ID
Похожие вопросы