Если вы создадите функцию верхнего уровня с именем main
в любом файле kotlin, рядом с ней появится зеленая кнопка запуска, позволяющая запустить ее как программу:
[113 ]
Обратите внимание, что это работает как в Android Studio, так и в IntelliJ IDEA.
Нет никакого раунда () в C++ 98 стандартных библиотек. Можно записать тот сами все же. Следующее является реализацией round-half-up:
double round(double d)
{
return floor(d + 0.5);
}
вероятной причиной там не является никакая круглая функция в C++, который 98 стандартных библиотек - то, что это может на самом деле быть реализовано по-разному. Вышеупомянутое является одним распространенным способом, но существуют другие такой как раунд-к-ровному , который менее смещается и обычно лучше, если Вы собираетесь сделать большое округление; это немного более сложно для реализации все же.
Это обычно реализуется как floor(value + 0.5)
.
Редактирование: и в это, вероятно, не заходят, так как существует по крайней мере три округляющихся алгоритма, о которых я знаю: вокруг обнулять, вокруг к самому близкому целому числу и округлению банкира. Вы просите раунд к самому близкому целому числу.
Я сделал это:
#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;
}
}
Вы можете округлить до 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;
}
Есть 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))
// 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. А не просто визуально влияет на вывод.
В 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;
}
Обратите внимание, что это работает, только если вы выполняете преобразование в целое число.