Problem z konversją i zaokrągleniem

Problem z konversją i zaokrągleniem
agnieszka
  • Rejestracja:ponad 19 lat
  • Ostatnio:około 15 lat
  • Postów:97
0

Witam,

Mam problem z odpowiednim formatowaniem liczby.

Kopiuj
TCHAR tab[] = "12.24";
float fx = _wtof(tab);
teraz fx == 12.24001

W jaki sposób zrobić aby w fx było 12.24 bez zbędnego kombinowania.

Pozdrawiam

MarekR22
Moderator C/C++
  • Rejestracja:około 17 lat
  • Ostatnio:5 minut
0
  1. nie używaj float. Nie warto, obliczania i tak wykonywane są na double, a dokładność float jest znacznie mniejsza
  2. pamiętaj, że to są liczby zmiennoprzecinkowe w zapisie binarnym. Czasami dokładna konwersja miedzy systemem binarnym a dziesiętnym nie jest możliwa tak jak np: pełny zapis 1/3 w zapisie dziesiętnym (0.333333333333(3)).
  3. przy konwersji do napisu można zawsze sformatować napis tak by nieznaczące cyfry były niewidoczne.

Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
agnieszka
  • Rejestracja:ponad 19 lat
  • Ostatnio:około 15 lat
  • Postów:97
0

No ale to nadal nie rozwiązuje mojego problemu.
Używając typy double mam liczbę z wieloma zerami i na końcu jedynka.

Ogólnie chodzi o to aby porównać dwie liczby typu float z tym że jedną otrzymuję dokładnie z dwoma miejscami po przecinku a jak wiadomo 5 zł i 5 zł i 0.00000000001 gr nie są sobie równe.

Wobec powyższego mam taką pseudo porównywarkę - ale może da się to inaczej zrobić niż przedstawiam - zależy mi na wydajności.

Kopiuj
int PriceCmp(TCHAR a[], TCHAR b[])
{
	int aa = _wtoi(a);
	int bb = _wtoi(b);
	if (aa != bb)
	{
		if (aa > bb) return 1;
		else return -1;
	}
	TCHAR adec[4], bdec[4];
	wmemset(adec, 0x00, 4);
	wmemset(bdec, 0x00, 4);
	int idxa = 0, idxb = 0;
	bool akropka = false, bkropka = false;

	for(int i = 0; i < 10; i++)
	{	
		if (akropka){
			adec[idxa++] = a[i];
			if (idxa == 2) break;
		}
		if (a[i] == '.')akropka =true;
	}

	for(int i = 0; i < 10; i++)
	{	
		if (bkropka){
			bdec[idxb++] = b[i];
			if (idxb == 2) break;
		}
		if (b[i] == '.')bkropka =true;
	}
	idxa = _wtoi(adec);
	idxb = _wtoi(bdec);
	if (idxa > idxb) return 1;
	if (idxa < idxb) return -1;
	return 0;
}
MarekR22
Moderator C/C++
  • Rejestracja:około 17 lat
  • Ostatnio:5 minut
0

Kodu nie czyałem, ale jeśli porównujesz cenny to dla liczb zmiennoprzecinkowych robi się to tak:

Kopiuj
const double KPricePrecision = 0.005;
int PriceCmp( double a, double b) {
     double delta = a-b;
     if(fabs(delta)<KPricePrecision) {
          return 0;
     }
     if(delta<0) {
          return -1;
     }
     return 1;
}

Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
WA
  • Rejestracja:prawie 22 lata
  • Ostatnio:ponad 2 lata
0

zawsze możesz pomnożyć liczbę tak aby przesunąć przecinek w prawo i zaokrąglić do całkowitych. Później rzutujesz to na inta i porównuje ci bez problemu.

No chyba że liczba po przemnożeniu przez 10^x przekracza zakres inta.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.