Problem z konversją i zaokrągleniem

0

Witam,

Mam problem z odpowiednim formatowaniem liczby.

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

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.
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.

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;
}
0

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

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;
}
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.

1 użytkowników online, w tym zalogowanych: 0, gości: 1