Zdravím!
Trochu jsem se tím také zabýval a souhlasím s panem Pecinovským.
Zkuste si jednoduchý příklad:
double d1=39.9d*0.1d;
double d2=39.9d/10d;
System.out.println(d1+" xxx "+d2);
System.out.printf("%.2f xxx %.2f\n",d1,d2);
-- výsledek:
3.99 xxx 3.9899999999999998
3,99 xxx 3,99
Pokud je v DB datový typ float(8), tak to přesně odpovídá double v jave.
Nezapomeňme, že v jave ma float delku 4 byty a double 8 bytů.
Pokud by přesto v DB bylo číslo uloženo jako float(4),
můžete přece to číslo načíst do double a pracovat s tím jako s double.
Teprve těsně před uložením to číslo opět převedete na float.
Pokud nebudete s přesností stále spokojeni, tak použijte BigDecimal (už
o tom byla řeč).
Fafi
Petr Zajíc wrote:
>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
>
>
>
>
>
--
Ing. Ondřej Fafejta, programátor
----------------------------------
E-mail: [EMAIL PROTECTED]
----------------------------------
KYBERIE
Web: http://www.kyberie.cz
Tel: +420226002016