2011-01-24 34 views
5

C++ không phải là ngôn ngữ của tôi để tha thứ cho vấn đề đơn giản này. Tôi đang mất chính xác trong một chuyển đổi atof từ chuỗi để tăng gấp đôi, bất cứ ai có thể giúp đỡ?Chuỗi C++ để nhân đôi chuyển đổi mất chính xác?

string lAmount; 

string lSuspendedInt = "131663.51"; 
string lAccruedInterest = "0.0"; 
double dSuspendedInt= atof(lSuspendedInt.c_str()); //PROBLEM HERE? 
double dAccruedInterest = atof(lAccruedInterest.c_str()); 
double dTotal = dSuspendedInt + dAccruedInterest; 

char cAmount[50]; 

memset(cAmount,0X00,sizeof(cAmount)); 
    sprintf(cAmount,"%g*",dTotal); 
    lAmount = cAmount; 


cout << "lAmount: "<<lAmount<<endl; //PRINTING: 131664 not 131663.51 

Tôi đã chơi với% f trong hàm memset tuy nhiên điều này mang đến cho 131663,510000

Cảm ơn trước.

Sapatos

+0

Nếu tôi cần chính xác số tiền này, tôi sẽ xem xét sử dụng điểm cố định để thay thế. Về phía C + +, tôi chắc chắn có những cách tốt hơn để chuyển đổi chuỗi để tăng gấp đôi bên cạnh atof. sprintf() là một cách khác để thực hiện nó nếu bạn nghĩ rằng vấn đề là có. Như một bình luận như tôi không có câu trả lời chính xác ở đây cho bạn. –

+1

@Michael: người ta có thể sử dụng luồng, mặc dù nó cồng kềnh, C++ 0x giới thiệu các hướng dẫn cụ thể 'stof' (và cả gia đình) như là một phần của Thư viện chuẩn. –

Trả lời

3

Sự cố là toán tử định dạng %g của bạn, không được chỉ định với độ chính xác đủ. Thay vào đó, bạn có thể muốn %.2f in hai chữ số sau dấu thập phân.

+0

thansk hoạt động – sapatos

2

Các sprintf định dạng %g specifier mặc định là in sáu chữ số có nghĩa. Nếu bạn muốn nhiều hơn, bạn có thể chỉ định rõ ràng số lượng sẽ được in:

sprintf(cAmount,"%.8g*",dTotal); 
1

atof tạo ra gấp đôi. Xem here. Vấn đề của bạn là số %g trả về ký hiệu ngắn hơn hoặc ký hiệu khoa học. Xem here. Cũng xin lưu ý rằng bạn đang thêm ký hiệu trong *, biểu thị rằng có một cắt xén dự kiến ​​trong số ký tự được in.

+0

* là một lỗi đánh máy: ( – sapatos

+0

Ký hiệu '*' sẽ cần phải có trước khi trình biến đổi chuyển đổi có bất kỳ ảnh hưởng nào ... vì nó chỉ được in ra dưới dạng ký tự bình thường. –

Các vấn đề liên quan