Округление дробных чисел. С++

141
22 сентября 2019, 16:30
template <typename T> struct Test
{
    T value;
    Test(T valueOfUser = 0):value(valueOfUser) {}
    Test<T> operator * (float k) {return Test<T>(value*k);}
};
int main()
{
    Test<int> t(5);
    Test<int> t1= t*1.999999;
    std::cout << t1.value; // 9
    return 0;
}

Можно ли сделать так,чтобы округлялось в большую или меньшую сторону в зависимости от полученного значения , только тогда, когда у меня тип int. С float и double округлять конечно не надо

Answer 1

Например, такой вариант (с++17):

#include <cmath>
#include <iostream>
#include <type_traits>
template <typename T> struct Test
{
    T value;
    Test(T valueOfUser = 0):value(valueOfUser) {}
    Test<T> operator * (double k) {
        if constexpr (std::is_integral_v<T>)
            return Test<T>(std::lround(value*k));
        else
            return Test<T>(value*k);
    }
};
int main()
{
    Test<int> t(5);
    Test<int> t1= t*1.999999;
    std::cout << t1.value; // 10
}
Answer 2

Проверить можно здесь.

#include <iostream>
#include <cmath>
template<typename T>
class basic_wrapper {
public:
    explicit basic_wrapper(const T& value)
        : value_(value)
    {}
protected:
    T value_;
    template<typename U>
    friend std::ostream& operator<<(std::ostream& s, const basic_wrapper<U>& w) {
        return (s << w.value_);
    }
};
template<typename T>
class wrapper : public basic_wrapper<T> {
public:
    explicit wrapper(const T& value)
        : basic_wrapper<T>(value)
    {}
    template<typename U>
    friend wrapper operator*(const wrapper& w, U k) {
        return wrapper(static_cast<T>(w.value_ * k));
    }
};
template<>
class wrapper<int> : public basic_wrapper<int> {
public:
    explicit wrapper(int value)
        : basic_wrapper(value)
    {}
    template<typename U>
    friend wrapper operator*(const wrapper& w, U k) {
        return wrapper(static_cast<int>(std::floor(w.value_ * k)));
    }
};
using integer_wrapper = wrapper<int>;
int main() {
    integer_wrapper w { 100 };
    std::cout << (w * 1.2019) << std::endl;
    return 0;
}
READ ALSO
Как удалить файл qt c++?

Как удалить файл qt c++?

Мне нужно удалить файл либо же папку в какой либо дерикторииКак это можно сделать? Какие библиотеки подключить нужно?

155
как положить массив в массив?

как положить массив в массив?

в общем создал функцию которая создаёт массив

120
Проверка значения аргумента constexpr функции

Проверка значения аргумента constexpr функции

Есть класс и перегрузка оператора []

102
Как создать бесконечный цикл

Как создать бесконечный цикл

Как звучит задача:

482