вокруг () для плавания в C++

Если вы создадите функцию верхнего уровня с именем main в любом файле kotlin, рядом с ней появится зеленая кнопка запуска, позволяющая запустить ее как программу:
[113 ] enter image description here

Обратите внимание, что это работает как в Android Studio, так и в IntelliJ IDEA.

227
задан Post Self 15 March 2017 в 15:55
поделиться

7 ответов

Нет никакого раунда () в C++ 98 стандартных библиотек. Можно записать тот сами все же. Следующее является реализацией round-half-up:

double round(double d)
{
  return floor(d + 0.5);
}

вероятной причиной там не является никакая круглая функция в C++, который 98 стандартных библиотек - то, что это может на самом деле быть реализовано по-разному. Вышеупомянутое является одним распространенным способом, но существуют другие такой как раунд-к-ровному , который менее смещается и обычно лучше, если Вы собираетесь сделать большое округление; это немного более сложно для реализации все же.

143
ответ дан Andreas Magnusson 23 November 2019 в 03:48
поделиться

Это обычно реализуется как floor(value + 0.5).

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

27
ответ дан Tim Cooper 23 November 2019 в 03:48
поделиться

Я сделал это:

#include <cmath.h>

using namespace std;

double roundh(double number, int place){

    /* place = decimal point. Putting in 0 will make it round to whole
                              number. putting in 1 will round to the
                              tenths digit.
    */

    number *= 10^place;
    int istack = (int)floor(number);
    int out = number-istack;
    if (out < 0.5){
        floor(number);
        number /= 10^place;
        return number;
    }
    if (out > 0.4) {
        ceil(number);
        number /= 10^place;
        return number;
    }
}
-6
ответ дан 23 November 2019 в 03:48
поделиться

Вы можете округлить до n цифр с точностью:

double round( double x )
{
const double sd = 1000; //for accuracy to 3 decimal places
return int(x*sd + (x<0? -0.5 : 0.5))/sd;
}
6
ответ дан 23 November 2019 в 03:48
поделиться

Есть 2 проблемы, которые мы рассматриваем:

  1. преобразования округления
  2. преобразование типов.

Преобразования округления означают округление ± float/double до ближайшего floor/ceil float/double. Возможно, на этом ваша проблема заканчивается. Но если ожидается, что вы вернете Int/Long, вам придется выполнить преобразование типа, и, таким образом, проблема "Переполнения" может ударить по вашему решению. Итак, проверьте, нет ли ошибок в вашей функции

long round(double x) {
   assert(x >= LONG_MIN-0.5);
   assert(x <= LONG_MAX+0.5);
   if (x >= 0)
      return (long) (x+0.5);
   return (long) (x-0.5);
}

#define round(x) ((x) < LONG_MIN-0.5 || (x) > LONG_MAX+0.5 ?\
      error() : ((x)>=0?(long)((x)+0.5):(long)((x)-0.5))

из : http://www.cs.tut.fi/~jkorpela/round.html

13
ответ дан 23 November 2019 в 03:48
поделиться
// Convert the float to a string
// We might use stringstream, but it looks like it truncates the float to only
//5 decimal points (maybe that's what you want anyway =P)

float MyFloat = 5.11133333311111333;
float NewConvertedFloat = 0.0;
string FirstString = " ";
string SecondString = " ";
stringstream ss (stringstream::in | stringstream::out);
ss << MyFloat;
FirstString = ss.str();

// Take out how ever many decimal places you want
// (this is a string it includes the point)
SecondString = FirstString.substr(0,5);
//whatever precision decimal place you want

// Convert it back to a float
stringstream(SecondString) >> NewConvertedFloat;
cout << NewConvertedFloat;
system("pause");

Возможно, это неэффективный грязный способ преобразования, но, черт возьми, он работает lol. И это хорошо, потому что это относится к реальному float. А не просто визуально влияет на вывод.

-4
ответ дан 23 November 2019 в 03:48
поделиться

В Boost также реализован определенный тип округления:

#include <iostream>

#include <boost/numeric/conversion/converter.hpp>

template<typename T, typename S> T round2(const S& x) {
  typedef boost::numeric::conversion_traits<T, S> Traits;
  typedef boost::numeric::def_overflow_handler OverflowHandler;
  typedef boost::numeric::RoundEven<typename Traits::source_type> Rounder;
  typedef boost::numeric::converter<T, S, Traits, OverflowHandler, Rounder> Converter;
  return Converter::convert(x);
}

int main() {
  std::cout << round2<int, double>(0.1) << ' ' << round2<int, double>(-0.1) << ' ' << round2<int, double>(-0.9) << std::endl;
}

Обратите внимание, что это работает, только если вы выполняете преобразование в целое число.

11
ответ дан 23 November 2019 в 03:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: