Почему мои поплавки настаивают на том, чтобы оставаться целыми числами? - PullRequest
3 голосов
/ 25 февраля 2012

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

int YYYY, JJJ, HH, MM;

float datenumber = (YYYY*360.0f)+(JJJ*1.0f)+((HH*1.0f)+(MM/60.0f))/24.0f;

Используя значения 2001, 083, 22, 32, я должен получить результат 724043.939.Вместо этого я получаю 724044.

У меня все целые числа разыгрываются как поплавки.Почему они остаются целыми числами?

edit Да, я выводил вывод с помощью cout.setprecision решил проблему, спасибо.

Ответы [ 5 ]

3 голосов
/ 25 февраля 2012

Проблема не в вашем числе или ваших расчетах. Это только в том виде, в каком вы его отображаете. cout решил, что вам достаточно 6 цифр. Используйте setprecision, если хотите больше.

std::cout << std::setprecision(10) << datenumber;

демо

1 голос
/ 25 февраля 2012

Вам нужно сделать ДВА вещи:

  1. Установите максимальную точность (cout.setprecision(16))
  2. Преобразовать в double (double dateNumber и YYYY*360.0)
0 голосов
/ 25 февраля 2012

Судя по вашим входным и выходным значениям в примере, который вы предоставили в ответе Бенджамина, я готов поспорить, что проблема заключается только в точности с плавающей запятой. То, что вы объявляете что-то как число с плавающей точкой, не означает, что оно может обрабатывать числа любого размера. Проблема заключается в том, что ваш компонент года (1200 * 360 = 432000) НАМНОГО больше, чем компонент MM (5/60/24 = .00347222). Десятичная часть из части MM просто игнорируется, потому что числа с плавающей точкой не так точны. Попробуйте добавить .000001 к 123456789 как число с плавающей точкой и посмотрите, что вы получите

0 голосов
/ 25 февраля 2012

Следующее может быть причиной 1. Может быть, вы печатаете их неправильно. 2. Делая на целое число, используйте вместо этого float.

Пример - вместо деления на 200 делим на 200,0

0 голосов
/ 25 февраля 2012

Если у вас нет еще кода, который выполняет приведение в другом месте, вы выполняете приведение после того, как выполнили уравнение, поэтому вы возвращаете число с плавающей запятой, но с использованием целых чисел в уравнении до того, как ваш бросок выпал десятичные дроби.

Почему бы изначально не объявить их как плавающие?

float YYYY, JJJ, HH, MM;
...