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


Odpovedet emailem