ED IT 1: Szukałem rozwiązań dla numpy w python i nie zdawałem sobie sprawy, że OP poprosił o C++ haha, no cóż.
EDYCJA 2: Lol, wygląda na to, że nawet nie odpowiedziałem na twoje pierwotne pytanie. Wygląda na to, że naprawdę chcesz zaokrąglić w kolejności dziesiętnej (operacja jest niezależna od podanej liczby), a nie precyzji (operacja zależy od liczby), a inni już to rozwiązali.
Właściwie to rozglądałem się za tym, ale nie mogłem znaleźć czegoś, więc zrzuciłem implementację dla numpy array. Wygląda na to, że implementuje logikę, o której mówi slashmais.
def pround(x, precision = 5):
temp = array(x)
ignore = (temp == 0.)
use = logical_not(ignore)
ex = floor(log10(abs(temp[use]))) - precision + 1
div = 10**ex
temp[use] = floor(temp[use]/div + 0.5) * div
return temp
Oto C++ wersja skalarne, jak również i prawdopodobnie można by było zrobić coś podobnego do wyżej, stosując Eigen (mają logiczne indeksowanie): (I wziął również to jako szansę ćwiczyć trochę więcej impuls haha):
#include <cmath>
#include <iostream>
#include <vector>
#include <boost/foreach.hpp>
#include <boost/function.hpp>
#include <boost/bind.hpp>
using namespace std;
double pround(double x, int precision)
{
if (x == 0.)
return x;
int ex = floor(log10(abs(x))) - precision + 1;
double div = pow(10, ex);
return floor(x/div + 0.5) * div;
}
template<typename T>
vector<T>& operator<<(vector<T> &x, const T &item)
{
x.push_back(item);
return x;
}
int main()
{
vector<double> list;
list << 0.051 << 0.049 << 0.56 << 0.54;
// What the OP was wanting
BOOST_FOREACH(double x, list)
{
cout << floor(x * 10 + 0.5)/10 << "\n";
}
cout << "\n";
BOOST_FOREACH(double x, list)
{
cout << pround(x, 0) << "\n";
}
cout << "\n";
boost::function<double(double)> rounder = boost::bind(&pround, _1, 3);
vector<double> newList;
newList << 1.2345 << 1034324.23 << 0.0092320985;
BOOST_FOREACH(double x, newList)
{
cout << rounder(x) << "\n";
}
return 0;
}
wyjściowa:
0.1
0
0.6
0.5
0.1
0
1
1
1.23
1.03e+06
0.00923
możliwe duplikat (http://stackoverflow.com/questions/5834368/how -to-round-to-integer-natural-in-c) –
Zaokrąglanie liczby zmiennoprzecinkowej do 1 lub więcej miejsc dziesiętnych nie ma większego sensu; liczba taka jak "0,1" nie może być dokładnie odwzorowana w binarnym zmiennoprzecinkowaniu. Zaokrąglanie można wykonać na wyjściu (do napisu lub do pliku). –
Jesteśmy w dziale IT, staramy się reprezentować nieskończone możliwości realnego świata w liniach kodu, wszystko ma sens tutaj. Używam tego do nieskończonego przewijania tła w grze, stracona precyzja nie ma znaczenia. – SteveL