ED CNTT 1: Tôi đã tìm kiếm các giải pháp cho numpy trong python và không nhận ra rằng OP yêu cầu cho C + + haha, oh well.
CHỈNH SỬA 2: Rất tiếc, có vẻ như tôi thậm chí không giải quyết được câu hỏi ban đầu của bạn. Dường như bạn đang thực sự muốn làm tròn theo một số thập phân (hoạt động độc lập với số đã cho), không phải là độ chính xác (hoạt động phụ thuộc vào số), và những người khác đã giải quyết điều đó.
Tôi thực sự đang tìm kiếm điều này nhưng không thể tìm thấy thứ gì đó, vì vậy tôi đã cùng nhau triển khai thực hiện các mảng có nhiều mảng. Có vẻ như nó thực hiện logic mà slashmais đã nói.
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
Dưới đây là một phiên bản vô hướng C++ là tốt, và bạn có thể có thể làm điều gì đó tương tự như trên sử dụng Eigen (họ có indexing logic): (Tôi cũng mất này như một cơ hội để thực hành một số tăng hơn 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;
}
Output:
0.1
0
0.6
0.5
0.1
0
1
1
1.23
1.03e+06
0.00923
có thể trùng lặp của [Làm thế nào để làm tròn thành số nguyên (tự nhiên) trong C++?] (Http://stackoverflow.com/questions/5834368/how -to-round-to-integer-natural-in-c) –
Làm tròn số dấu phẩy động đến 1 hoặc nhiều chữ số thập phân không có ý nghĩa nhiều; một số như '0.1' không thể được biểu diễn chính xác trong dấu phẩy động nhị phân. Làm tròn có thể được thực hiện trên đầu ra (đến một chuỗi hoặc một tập tin). –
Chúng tôi đang ở trong bộ phận CNTT, chúng tôi đang cố gắng để đại diện cho khả năng vô hạn của thế giới thực trong dòng mã, tất cả mọi thứ có ý nghĩa ở đây. Tôi đang sử dụng điều này cho một nền cuộn vô hạn trong một trò chơi, mất độ chính xác không thực sự quan trọng. – SteveL