Nechci se do Vás nějak navážet, ale není Vám divné, že asi 10 lidí reaguje víceméně shodně a Vy to nejste schopen uznat? Ve chvíli, kdy bych měl pracovat s DB jiného programu, který má částky ukládaný jako float bych z projektu rychle utekl, protože na to se smysluplně navázat opravdu nedá.
Jedině mám pro Vás tip používat celá čísla a pak si to nějak převádět - už to tady v odpovědích taky zaznělo - kde třeba 10,50 Kč byste si ukládal jako celé číslo 1050 a pak to konvertoval. Obdobně to dělají databáze, ze způsobu uložení přesných a nepřesných čísel se můžete dosti naučit. Petr Zajíc -----Original Message----- From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] Behalf Of Benda Lukas Sent: Friday, February 24, 2006 12:42 AM To: Java Subject: Re: Numericke operace na typem Double Bohuzel ve chvili kdyz musite pracovat s DB jineho programu ktery ma castky ukladany jako float(8), tak na vyber nemate :(( > Dobry den, > C# je na tom s delenim desetinych cisel jako java, c++ a nejspis > vsechny ostatni jazyky tedy tez nedava presny vysledek pokud > nepouzijete specialni objekt pro presne pocitani. > Chran nas panbuh od programu ktere pocitaji ze 1 je koruna a ne haler. > > S pozdravem > Pavel Savara > > Viz google predpokladam ze to tak je nejsem c# expert: > >> Does C# have the same problem as C++ with code like this? >> > > >> if (GetDouble1() == GetDouble2()) >> { >> } >> > > >> In C++, due to the IEEE storage format, it is possible to have 2 doubles >> that are essentially the same value but not quite, so the above code will >> not do what you expect. Boost has some extensions to STL to solve this >> problem. >> > > >> Does C# have similar problems? If so, what is the right C# way of >> > handling > >> this issue? >> > > Yes, floating-point (not just double precision) numbers/arithmethic has this > problem in virtually every language because of the representation that you > have noted. One way of handling this is to calculate the precision of the > machine that your code is running on and then do a comparison to see if the > difference is less than or equal to the precision of the machine. If it is, > then the values are identical as far as you can tell. > > Note that C# has the "Decimal" type that can help is many situations. > > Regards, > Randy > > On 2/23/06, Benda Lukas <[EMAIL PROTECTED]> wrote: > >> Vsechny ulohy kde je treba pocitat s penezi na dve desetine mista (takze >> kdyz vlastne kazde ucetnictvi) potrebuje, jak jsem psal v predchozim >> prispevku >> 39.9 / 10 a 39.9 * 0.1 pri formatovani vystupu %.2f da jednou vysledek >> 3.99 a podruhe 4 a hned mate halerove manko. >> >> Tady se rekne halir, tezko rict jestli nenajdeme kombinaci cisel kdy to >> da deset haleru. Pak uz zacnou problem a velke problemy. >> >>>> At se to zda absurdi kupodivu v naprosto bezne praci >>>> potrebuju presnost. >>>> Kdyz mam delat testy musim mit jistotu ze 39.9 / 10 = 39.9 *0.1 = >>>> 39.9/100. Kdyz mi kazda tato operace vrati jiny vysledek pak je neco >>>> sakra spatne. Takze typ double pro mne vlastne efektvine skocil. >>>> >>>> >>> Sakra špatně je program, který testuje dva double na rovnost. Všechny slušné kurzy >>> programování jasné varují, že přímé porovnání dvou hodnot double je zakázaná operace. >>> Lze-li předem odhadnout řádovou velikost provonávaných hodnot, musí se dvě hodnoty d1 a >>> d2 typu double porovnávat buď >>> >>> abs(d2 - d1) < eps >>> >>> kde eps je nějaké předem zvolené číslo, které je výrazně menžší než požadovaná přensot >>> (už to tu někdo psal). >>> >>> Není-li možno předem odhadnout řádovou velikost (tj. jestli to budou tisíce nebo >>> tisíciny), je to obtížnější - pak se musí porovnávat např. >>> >>> abs(1 - d1/d2) < eps >>> >>> Při běžné práci opravdu není potřeba větší přesnost, než oněch doublem zaručených 15 >>> cifer. S takovou přesností se totiž v běžné praxi nic neměří, takže není důvod na ní >>> trvat. Taková zaručená přesnost je většinou potřeba pouze ve finančních výpočtech, kde >>> potřebujete počítat miliardami a bilióny s přesností na halíře. Druhou oblastí jsou pak >>> naumerická řešení všelijakých rozsáhlých rovnic popisujících tuhé systémy, protože tam >>> je občas potřeba odečíst dvě skoro stejná čísla a nemám-li dostatečný počet platných >>> cifer, jsem v ... >>> >>> Opravdu existují úlohy, kde je třeba místo double používat např. BigDecimal, ale není >>> jich tak moc. I při výpočtech s pomocí BigDecimal vznikají zaokrouhlovací chyby a hlavně >>> jsou tyto výpočty mnohem, ale opravdu mnohem pomalejší. Ne vždy jsme přitom za ono >>> částečné zvýšení přesnosti ochotni touto pomalostí platit. >>> >>> >>> >>> >> ________ Information from NOD32 ________ This message was checked by NOD32 Antivirus System for Linux Mail Server. http://www.nod32.com
