int — Целочисленное округление в переполнении стека

Я пытался использовать формулу ниже в C ++. У меня есть обе переменные, объявленные как целые числа, и я ожидаю, что они округляются вверх, но они, кажется, округляются вниз. Я посмотрел на это, но не могу найти, что не так. Любая помощь будет принята с благодарностью.

int user_degrees_latitude, user_degrees_longitude;
const int lat_const=(-90)
const int long_const=(-180)

sector_latitude = (user_degrees_latitude - lat_const) / (10);
sector_longitude = (user_degrees_longitude - long_const) / (10);

Ответ должен быть 13 для sector_latitude и 11 для sector_longitude, но каждый компьютер округляет до 12 и 10 соответственно.

2

Решение

В C ++ целые числа не округляются. Вместо этого целочисленное деление усекает (читай: всегда округляет до нуля) остаток от деления.

Если вы хотите получить эффект округления для положительный целые числа, вы могли бы написать:

sector_latitude = static_cast<int>(((user_degrees_latitude - lat_const) / (10.0)) + 0.5);

При добавлении 0,5 усечение приводит к эффекту округления. Обратите внимание на добавление .0 на 10.0 заставить деление с плавающей запятой перед сложением.

Я также предположил, что sector_latitude был инт с кастингом.

9

Другие решения

Целочисленное деление в C ++ всегда округляет до нуля. Используйте деление с плавающей точкой, чтобы получить «точные» результаты и использовать std::round округлить по обычным правилам:

sector_latitude = static_cast</*type of sector_latitude*/>( std::round( (user_degrees_latitude - lat_const) / 10.0 ));

«10,0» ( double) вместо «10» ( int) указывает компилятору использовать арифметику с плавающей точкой. Он всегда выбирает вычисление с плавающей запятой над целочисленным, если значение с плавающей запятой, такое как double вовлечен.

4

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector