2011-01-24 28 views
5

C++ benim dilim değil, bu basit sorunu affedin. Bir dizgeden dize çift dönüşümünde hassaslık kaybediyorum, herkes yardımcı olabilir mi? Ben memset fonksiyonunda% f ile oynadımC++ Çift atof dönüşümü hassasiyeti kaybediyor mu?

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 

ancak bu önceden 131663,510000

Teşekkür verir.

Sapatos

+0

Bu miktarın tam olarak buna ihtiyacım olsaydı, bunun yerine sabit nokta kullanmayı düşünürdüm. C++ tarafında, atof'un yanı sıra dize dönüştürmek için daha iyi yollar olduğundan eminim. sprintf(), sorunun var olduğunu düşünüyorsanız, bunu yapmanın başka bir C yoludur. Benim için tam bir cevabım olmadığı için bir yorum olarak. –

+1

@Michael: Akışlar olsa da, hantal, C++ 0x, Standart Kitaplığın bir parçası olarak belirli "stof" (ve tüm aile) yönergelerini tanıtır. –

cevap

3

Sorun, yeterli hassasiyetle belirtilmemiş olan %g biçimindeki operatörünüzdür. Bunun yerine, ondalık noktadan sonra iki basamak basan %.2f olmasını isteyebilirsiniz.

+0

çalışan thansk – sapatos

2

altı önemli basamak baskı yapmak için sprintf%g biçim belirteci varsayılan. Eğer daha fazla isterseniz, açıkça basılacak kaç belirtebilirsiniz:

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

fonksiyon atof çift oluşturur. Bakınız here. Sorununuz, %g'un, daha az şamandıra veya bilimsel gösterim döndürmesidir. Bakınız here. Ayrıca, yazdırılan karakter sayısında beklenen bir kesinti olduğunu belirten * notasyonuna eklediğinizi unutmayın.

+0

* bir yazım hatası oldu :( – sapatos

+0

"*" gösterimi, dönüşüm belirtecinin herhangi bir şekilde etkilenmeden önce olması gerekiyordu ... normal bir karakter olarak yazdırıldığı gibi ... –

İlgili konular