Witam,
Mnoz ma wartośc 1.17, robię mnoznikUp i jest 1.18, ok, a potem dodaję jeszcze raz i już jest 1.190001, myslę że to nie przez firebase, bo przecież wartość w bazie danych wstawiam jako string.
Witam,
Mnoz ma wartośc 1.17, robię mnoznikUp i jest 1.18, ok, a potem dodaję jeszcze raz i już jest 1.190001, myslę że to nie przez firebase, bo przecież wartość w bazie danych wstawiam jako string.
No bo tak jest, ze względu na ograniczoną precyzję floata.
Pytanie czy to 0.000001 ma dla ciebie praktyczne znaczenie?
wystarczy poczytać o precyzji liczb zmiennoprzecinkowych, sposobie ich zapisu i dlaczego nie da się w nich zapisać niektórych ułamków.
BTW jak i tak zamieniasz na stringa (kto zapisuje liczbę jako stringa w bazie?) to wystarczy https://docs.microsoft.com/en-us/dotnet/standard/base-types/standard-numeric-format-strings
często tak, bo np. gdy podwyższam o to 0.01F to z 1.56 robi mi się 1.569999999, a wyświetlam tylko dwie pierwsze liczby po przecinku i to dziwnie wygląda
Ogólnie jeśli to jest float i wyświetlasz dwa miejsca po przecinku - to Ci to przecież nie robi różnicy.
Jesli jednak to tak naprawdę pieniądze (monety, złotówki, dolary, ruble), a Tyś użył do ich przechowania float (czy double) - to trzeba będzie to zgłosić do prokuratury programistycznej.
I będzie zakaz wykonywania zawodu jak nic.
To nie pieniądze, ale na przyszłość dla bezpieczeństwa spytam: w czym przechowuje się pieniądze?
W większości przypadków jest BigDecimal
, ale obecnie mamy javax.money
gdzie masz odpowiednie typy, które uwzględniają specyfikę niektórych walut.
Najlepiej wykonać sobie taki kod, żeby zobaczyć skąd to się bierze :).
System.out.printf("%.10f", 0.01F);
I do czego się to używa? Jeżeli mam program który mnoży kilka liczb przez siebie (floatów) to mogę wyświetlać cenę (iloczyn) jako float czy w jaki sposób się robi takie rzeczy? W jaki sposób przechowywać czynniki mnożenia i wynik który jest cena za produkt?
Jeżeli masz jakąkolwiek cenę / pieniądz/ procenty /kredyty to float i double i podobne są wykluczone. Kara za to może być sroga (jak zrypane wyniki pójdą do np. urzędu skarbowego (faktury!!)). W javie" najprościej" możesz ceny trzymać w BigDecimal.
Okej, ale jakbym pracował to by raczej jakiś senior w grupie nad tym czuwał? Przecież początkujących nie zatrudniają bez nadzoru przy aplikacjach z pieniędzmi
@MrCode: nie będzie czuwać, bo nieznajomość arytmetyki liczb zmiennoprzecinkowych pozwala odsiać na rozmowie.
@Koziołek optymista.
Nie wiesz nawet ile razy to widziałem. nawet w kodach systemów bankowych. Nawet z gościami,którzy dumnie tłumaczyli, ze maja taką super metodę fixNumericalErrors - która poprawia błędy zaokrągleń po javie, żeby się zgadzało z innymi systemami... .(Btw ta metoda też nie działała).
Ale ludzi całkiem bez doświadczenia przy systemach bankowych raczej nie zatrudniają
Czyli ta kara za używanie floatów ma się na przykład przy tym jak jest produkt cena netto 56.70zl i VAT 23%, jeżeli liczę to na floatach to podlega pod przestępstwo?
@jarekr000000: jak zawsze :) Charakter Chaotyczny-Dobry zobowiązuje :) Najlepiej wyglądało to w jednym systemie, który robiliśmy. Był po prostu typ trzymający 17cyfr jako tablicę i było ok.
@MrCode w bankach pracują programiści tacy sami jak gdzie indziej. Juniorów i praktykantów też przyjmują. A zatrudnienie programisty z 15letnim stażem też niczego nie gwarantuje.
Obliczenia stóp procentowych, kredytów, vat itp. sa unormowane prawnie i to idzie dalej niż tylko nie używanie float/double (bo np. jasno jest określone jak sie zaokrągla). W java RoundingMode nie ma RoundingMode.BEDE_PANU_WINNA_GROSIKA. Jak się nie będa zgadzac grosze, to np. księgowośc nie bedzie mgła zrobić bilansu w firmie...Urząd skarbowy może zakwestionować faktury itp. klient banku może pozwać za fałszywe wyliczenie rzeczywistej stopy procentowej
To dzięki za uświadomienie, dobrze że teraz się o tym dowiedziałem a nie kiedyś gdy może przyjdzie mi pracować przy takich rzeczach