ED IT 1:我一直在尋找python的numpy解決方案,並沒有意識到OP要求C++哈哈,哦。
編輯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++標版本,以及,你可能會做同樣的事情上面使用艾根(他們有邏輯索引):(我也把這個作爲一個機會練習一些提振哈哈):
#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
可能重複的[如何在C++中整數(自然)舍入?](http://stackoverflow.com/questions/5834368/how對於整數自然在c) –
將浮點數舍入到1或更多的小數位沒有多大意義;像'0.1'這樣的數字不能完全用二進制浮點表示。舍入可以在輸出上完成(對一個字符串或一個文件)。 –
我們在IT部門,我們試圖用代碼行代表真實世界的無限可能性,這裏的一切都很有意義。我在遊戲中使用無限滾動背景,失去精度並不重要。 – SteveL