Округление до 100 ед.

0

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

пример:

double x;
int x_final;
...
if (x<400) x_final=400;
else if (x<500) x_final=500;
else if (x<600) x_final=600;
...
Теги:
visual-studio-2010

4 ответа

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

Очевидным решением является использование remquo:

int
roundTo100( double x )
{
    int results;
    remquo( x, 100.0, &results );
    return 100 * results;
}

Для этого вам, вероятно, понадобится довольно недавний компилятор: функция была добавлена в C99 и C++ с C++ 11. В зависимости от платформы у вас может не быть вообще этого, или вы можете иметь ее только в <math.h> (но не в <cmath>). Если компилятор утверждает поддержку C++ 11, вы должны иметь ее в <cmath>. Но не верьте, пока вы его не увидели; никакой компилятор фактически не поддерживает C++ 11 до какой-либо реальной степени. На платформах, где есть поддержка C99 (которая будет включать почти все платформы Unix и CygWin под Windows), она должна присутствовать в <math.h>, независимо. (Но его нет в Visual Studios.)

В отсутствии этой функции что-то вроде:

int
roundTo100( double x )
{
    int results = round( x / 100 );
    return 100 * results;
}

может сделать трюк. Остерегайтесь того, что две функции круглые несколько иначе. Первый округляет, если остаток равен ровно 50, второй округлый до четного. Второй может потенциально ввести неточности из-за деления (или нет - я недостаточно анализировал его, чтобы быть уверенным так или иначе).

В зависимости от того, откуда исходит ваш x, различия округления или потенциальные неточности могут не быть проблемой. (Если, например, x получается из некоторых физических измерений с точностью до 3 десятичных цифр, то факт, что он может быть "неправильным", когда x удален от 50 к некоторому 1E14 или тому подобное, вероятно, не имеет значения.)

  • 0
    Спасибо вам большое! +1 для вас.
2

Чтобы округлить, вы можете использовать это:

x_final = ((int)x / 100 + 1) * 100;
  • 0
    Это не правильно: ((int) 49/100 + 1) * 100 = 100, но ближайший 100 равен 0. Я думаю, что нужно использовать round .
  • 0
    @utzrit Я слежу за кодом ОП, а не за описанием. Мысль это обычно более точно.
Показать ещё 3 комментария
0

ctry this:

#include <math.h>
...

x_final = ceil(x/100)*100;
0

Разделите его на 100 (игнорируя остаток), а затем умножьте его на 100.

#include <iostream>
using namespace std;

int main() {
    int val = 456;
    int r = (val / 100) * 100;
    cout << "r = " << r;
    return 0;
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню