2013-10-18 12 views
5

Tôi gặp sự cố khi chuyển đổi chuỗi thành gấp đôi. Tôi được cung cấp một chuỗi có toạ độ vĩ độ/kinh độ dài theo định dạng 33.9425/N 118.4081/WChuyển đổi chuỗi thành đôi - mất chính xác

Lần đầu tiên tôi gọi hàm của tôi là trimLastChar(std::string& input) hai lần, sẽ xóa ký tự Bắc, Nam, Đông, Tây và sau đó cắt gạch chéo. Hàm này trả về chính xác 33.9425118.4081 một cách tôn trọng dưới dạng std::string.

Tôi đang sử dụng mã sau để chuyển đổi std::string thành số double ... tuy nhiên vấn đề là, độ chính xác mất mát chuyển đổi - Tôi nghi ngờ nó được làm tròn ?.

// Location In String is what trimLastChar returns 
std::stringstream stream(locationInString); 
std::cout << "DEBUG: before: " << locationInString << " "; 
// output is a double* output = new double passed by reference to my function 
stream >> output; 
std::cout << output << std::endl; 

Sản lượng trong trường hợp này sẽ tạo ra:

33.9425 
118.408 

Như bạn thấy, giá trị chính xác nên được 118.4081 nhưng 1 là mất tích ...

Bất kỳ ý tưởng làm thế nào để khắc phục? Hay quan trọng hơn, tại sao điều này lại xảy ra?

+2

... bạn nên kiểm tra định dạng đầu ra của bạn, tôi đoán đây chỉ là một vấn đề định dạng trên cout. – IdeaHat

Trả lời

7

Độ chính xác không bị mất khi nhập. Nó đang bị mất trên đầu ra.

#include <iostream> 
using std::cout; 
using std::endl; 
int main() 
{ 
    double v = 118.4081; 
    cout << v << endl; 
    cout.precision(10); 
    cout << v << endl; 
} 

kết quả đầu ra:

$ g++ -Wall x.cpp && ./a.out 
118.408 
118.4081 
$ 
+0

cảm ơn ... điều đó đã xảy ra! – Adam

3

Bạn có thể có nhiều chữ số hơn kết quả hiển thị. Theo mặc định, chỉ một số chữ số nhỏ được hiển thị, bạn cần sử dụng std::setprecision để xem thêm chữ số. Hãy thử

std::cout << std::setprecision(10) << output << std::endl; 
Các vấn đề liên quan