Firebird/Interbase - zaokrąglanie double precision

Forum Komputery
Odpowiedz
15.04.2011 09:13
1
odpowiedz
Kyo_NPC
102
Senator

Firebird/Interbase - zaokrąglanie double precision

1,001 - 1 = 0,001? Nie :p wg bazy po wykonaniu tego działania mamy wynik rodzaju 0,00009999999989. Sytuacji takich jest całkiem sporo przy działaniach na liczbach zmiennoprzecinkowych. Przy wyświetlaniu zaokrąglonego wyniku wszystko jest ok ale przez ten błąd porównując np wartość 0,001 do wartości pola otrzymujemy false. Miał ktoś kiedyś z tym problem i wie jak go rozwiązać może? :>

15.04.2011 10:00
2
odpowiedz
DEXiu
151
Senator

Przy działaniach na wartościach zmiennoprzecinkowych porównywanie na zasadzie a==b jest ogólnie złym pomysłem. Spróbuj to obejść w ten sposób:
abs(a-b)<=eps
gdzie eps będzie jakąś bardzo malutką liczbą zmiennoprzecinkową.

(to oczywiście tylko pseudokod)

15.04.2011 10:12
Buli
3
odpowiedz
Buli
152
Konsul

Możesz spróbować porównywać do wartości o większej ilości miejsc po przecinku czyli np. 0.0001.
Drugim sensowym rozwiązaniem jest oddzielna procedura zaokrąglania i przpepuszczanie przez nią wszystkich wyników działań.

Forum Forum Komputery
Odpowiedz

GRYOnline.pl:

Facebook GRYOnline.pl Instagram GRYOnline.pl X GRYOnline.pl Discord GRYOnline.pl TikTok GRYOnline.pl Podcast GRYOnline.pl WhatsApp GRYOnline.pl LinkedIn GRYOnline.pl Forum GRYOnline.pl

tvgry.pl:

YouTube tvgry.pl TikTok tvgry.pl Instagram tvgry.pl Discord tvgry.pl Facebook tvgry.pl