Float dziwnie się zmienia

0

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.

0

No bo tak jest, ze względu na ograniczoną precyzję floata.
Pytanie czy to 0.000001 ma dla ciebie praktyczne znaczenie?

0

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

0

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

1

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.

0

To nie pieniądze, ale na przyszłość dla bezpieczeństwa spytam: w czym przechowuje się pieniądze?

1

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.

0

Najlepiej wykonać sobie taki kod, żeby zobaczyć skąd to się bierze :).

System.out.printf("%.10f", 0.01F);
0

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?

0

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.

0

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

0

@MrCode: nie będzie czuwać, bo nieznajomość arytmetyki liczb zmiennoprzecinkowych pozwala odsiać na rozmowie.

0

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

0

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?

0

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

2

@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

0

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

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