EDIT 1: Python で numpy のソリューションを探していましたが、OP が C++ を要求していることに気づきませんでした。
EDIT 2:笑、私はあなたの元の質問にさえ対処していないようです。精度(操作は数値に依存します)ではなく、小数(操作は指定された数値に依存しません)に従って四捨五入したいようです。他の人はすでにそれに対処しています。
私も実際にこれを探していましたが、何かを見つけることができなかったので、numpy 配列の実装をまとめました。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
これはC++スカラーバージョンでもあり、おそらくEigenを使用して上記と同様のことを行うことができます(論理インデックスがあります):(私はこれをさらにブーストハハを練習する機会としても取りました):
#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;
}
出力:
0.1
0
0.6
0.5
0.1
0
1
1
1.23
1.03e+06
0.00923