Заставить cpp_dec_float округлить

я использую .str(n, std::ios_base::scientific) печатать ccp_dec_floats.

Я заметил, что это округляет.

я использую cpp_dec_float для учета, поэтому мне нужно округлить вниз. Как это может быть сделано?

3

Решение

Это не округляется. На самом деле это делает банкирский раунд Жить на Колиру

#include <boost/multiprecision/number.hpp>
#include <boost/multiprecision/cpp_int.hpp>
#include <boost/multiprecision/cpp_dec_float.hpp>
#include <iostream>

namespace mp = boost::multiprecision;

int main()
{
using Dec = mp::cpp_dec_float_50;

for (Dec d : {
Dec( "3.34"),   Dec( "3.35"),   Dec( "3.38"),
Dec( "2.24"),   Dec( "2.25"),   Dec( "2.28"),
Dec("-2.24"),   Dec("-2.25"),   Dec("-2.28"),
Dec("-3.34"),   Dec("-3.35"),   Dec("-3.38"),
})
{
std::cout     << d.str(2, std::ios_base::fixed)
<< " -> " << d.str(1, std::ios_base::fixed) << "\n";
}
}

Печать:

3.34 -> 3.3
3.35 -> 3.4
3.38 -> 3.4
2.24 -> 2.2
2.25 -> 2.2
2.28 -> 2.3
-2.24 -> -2.2
-2.25 -> -2.2
-2.28 -> -2.3
-3.34 -> -3.3
-3.35 -> -3.4
-3.38 -> -3.4

Так что если вы хотите другой вид округления, вы бы хотели написать это явно

Вот общий подход (Жить на Колиру)

template <int decimals = 0, typename T>
T round_towards_zero(T const& v)
{
static const T scale = pow(T(10), decimals);

if (v.is_zero())
return v;

// ceil/floor is found via ADL and uses expression templates for optimization
if (v<0)
return ceil(v*scale)/scale;
else
// floor is found via ADL and uses expression templates for optimization
return floor(v*scale)/scale;
}

который, мы надеемся, компилируется до оптимального кода из-за статически известного масштабного коэффициента и использования шаблоны выражений в библиотеке повышения точности.

3

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

Я полагаю, вы пытаетесь достичь округления до определенного десятичного знака, правильно?

Стандартное округление

double rounding_func(double in, double precision){
return round(in*pow(10,precision))/pow(10,precision);
}

Но, как говорится в вашем названии, вы пытаетесь заставить его округлить, поэтому подумайте

double rounding_func(double in, double precision){
return floor(in*pow(10,precision))/pow(10,precision);
}

Удачи!

1

По вопросам рекламы [email protected]