Problem z zapisem liczby zmiennoprzecinkowej do bazy InterBase

0

Witam,
nie mogę sobie poradzić z dziwnym problemem zapisu liczby zmiennoprzecinkowej Float do bazy danych. Ale po kolei.
Mam zbudowaną bazę danych w InterBase 6. Piszę program w Borlandzie Builderze C++ 2009. Program ten realizuje już zapis danych do bazy. Wszystko jest OK z zapisem tekstu (varchar), liczb całkowitych (integer), jednak kiedy próbuję zapisać liczbę zmiennoprzecinkową (float) zapisuje się ona następująco:
np.:
1,5 zapisuje się w bazie jako 150000000000387;
0,21 zapisuje się jako 210000000000756; itd.
Natomiast jeżeli chcę do tego pola float zapisać liczbę całkowitą to zapisuje się ona poprawnie! Każda liczba zmiennoprzecinkowa zapisuje się jako piętnastocyfrowa liczba całkowita! Nie wiem co z tym fantem zrobić, ale podejrzewam że to jakiś mój głupi błąd! Jeżeli zapisuję liczbę bezpośrednio w InterBasie to jest OK. W kodzie źródłowym wydaje mi się że jest wszystko w porządku. Może ktoś się spotkał z podobnym problemem?
proszę o pomoc

0

Po pierwsze 1.5 nie 1,5 a po drugie, jeżeli chcesz dokładne liczby po przecinku to musisz liczbę całkowitą podzielić przez odpowiednią potęgę jedności.
Np: 145.67 zł
wprowadzasz do programu to w groszach 14567 / 100; - to Ci da wymarzony wynik.

0

1.5 to akurat musi ci zapisać dokładnie. Możesz mieć problem np z 1.2. Problem jest taki, że zapisie dwójkowym trudno jest dokładnie zapisać 0.2 (1/5) taka samo jak w zapisie dziesiętnym trudno jest zapisać 1/3 (0.333333(3)). Używając liczb o małej precyzji float tylko pogłębiasz ten problem.

  1. używaj double (float jest pozostałością historyczną i nie ma powodu by używać tego typu).
  2. najlepiej jak będziesz również odpowiednio formatował liczby przy konwersji do napisu uwzględniając dokładność zapisu.
0

zamieniłem float na double i poprawiło się o tyle że do bazy zapisują się już liczby nie piętnastocyfrowe, ale liczby całkowite, tj. zamiast np 0.15 w bazie zapisuje się 15. Nie wiem skąd ten problem. Co prawda mogę tak zapisaną liczbę przed odczytem dzielić przez 100, ale korzystam też z komponentu DBGrid który wyświetla zawartość tabeli i niestety trzeba by z nim kombinować żeby wyświetlał liczby zmiennoprzecinkowe.

0

Witam,
problem rozwiązałem w ten sposób, że przed zapisem liczby typu **double **do bazy Interbase mnożę ją przez 100, a w momencie odczytu dzielę przez 100. Musiałem dodatkowo oprogramować zdarzenie **OnGetText ** dla każdego pola typu **double **odczytywanego z tabeli przez co w komponencie **DBGrid **wyświetlana jest liczba zmiennoprzecinkowa, czyli to o co mi chodziło :)
Dzięki za pomoc, problem rozwiązany, choć nieco okrężną drogą :)

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