Создть число с плавающей запятой, используя целые числа

Я хочу создать число с плавающей запятой, имеющее только одну десятичную точку. У меня есть отдельные целые числа для обеих сторон. Пример:

int n1 = 8;

int n2 = 2;

Я хочу сделать 8.2 значением с плавающей запятой, используя отдельные целые числа. Пожалуйста, дайте мне решение.

, 👍0


2 ответа


Лучший ответ:

4

Кажется слишком простым:

float x = n1 + n2 * 0.1;

Есть ли подвох?

Изменить: метод, предложенный Мишелем Кейзерсом, а именно

float x = n1 + n2 / 10.0;

(я удалил лишние приведения) может быть немного точнее, но занимает дольше вычислять, поскольку деление происходит значительно медленнее, чем умножение на Уно. Вычисление n2/10.0 всегда дает правильно округленный результат, а именно число с плавающей запятой, которое лучше всего аппроксимирует точный математический результат. С другой стороны, n2*0.1 включает в себя два операции округления: одна во время компиляции, в представлении 0,1 (что не является точным числом с плавающей запятой), другой во время выполнения, который округляет результат умножения. Если n2 находится между 0 и 8, в конечном итоге вы получите в любом случае получить правильно округленный результат, как и в случае с n2/10.0. Однако если n2 равен 9, то

  • n2*0.1 дает 0,900000035762786865234375 (ошибка ≈ 3.6e-8)
  • n2/10.0 дает 0,89999997615814208984375 (ошибка ≈ -2.4e-8)

В первом случае ошибка округления в 1,5 раза больше, чем во втором.

,

2
float x = (float) n1 + (float) (n2 / 10.0);

Это работает, только если значение n2 состоит из 1 цифры. В противном случае следующие действия уменьшают его до тех пор, пока n2 не станет ниже 1,0:

float x = (float) n1;

float f2 = (float) n2;
while (f2 >= 1.0)
{
   f2 /= 10.0;
}
x = n1 + f2;
,