Tiež môžem potvrdiť že na jave 1.4.2_08 je všetko v poriadku.

Síce 39.9/10 = 3.9899999999999998, ale
Math.round(39.9/10.0 * 100) / 100.0 = 3.99 ako treba 
(vy ste tam mal Math.round(39.9/10.0 * 100) / 100 a to vrátilo správne 3.0)

39.9 * 0.1 = 3.99 - správne.
399 / 100.0 = 3.99 - tiež správne.

Kde teda je ten problém?

Rastislav "Bedo" Siekel

P.S. Samozrejme pokiaľ je už pripravené 
public BigDecimal setScale(int scale, int roundingMode),
myslím, že je zbytočné používať Math.round(x * 100) / 100.0.


> -----Original Message-----
> From: [EMAIL PROTECTED] 
> [mailto:[EMAIL PROTECTED] On Behalf Of Rudolf PECINOVSKÝ
> Sent: 24. februára 2006 0:52
> To: 'Java'
> Subject: RE: Numericke operace na typem Double
> 
> 
> > Stojim za tim, ze se chyba na trinactem miste v 99% pripadu 
> ignorovat
> > neda. Napr. pri formatovani pomoci sprintf jak je uvedeno vyse.
> 
> Opak je pravdou
> 
> 
> 
> > Konkretne cislo 39.9 / 10 se podle JAVA rovna 3.98999999998 takze ve
> > vyslednem formatovani se zobrazi 3.99 (teda pokdu zaokrouhluje, 
> > to jsem nezkousel jinak by to vyslo 3.98)
> > Kdyz ale provedete 39.9 * 0.1 tak podle JAVA dostanete 
> 4.00000000007 
> > takze ve vyslednem formatovani ziskate 4.00
> 
> Jak kde - mně vychází: 
> 39.9 * 0.1 = 3.99
> 39.9 + 0.1 = 40.0
> V programu:
>     public static void test() {
>         System.out.println("\f");
>         double a = 39.9;
>         double b = 0.1;
>         System.out.println( a + " * " + b + " = " + (a*b) );
>         System.out.println( a + " + " + b + " = " + (a+b) );
>     }
> 
> Díval jste se opravdu dobře na to, co zadáváte?
> 
> 
> 
> > Hle ona chyba se z trinacte pozice prenesla hned na treti.
> 
> Jak jsem byl ukázal, chyba naopak nebyla vůbec žádná. Nicméně 
> i kdyby byla taková, jak jste psal, tak se v žádnom případě 
> nepřesunula na třetí pozici, ale byla na jedenácté, protože 
> ten výsledek byl urrčitě výsledek nějakého sčítání a ne 
> násobení. Leda byste měl nějaký nabouraný koprocesor.
> 
> 
> 
> > Je vysoka pravdepodobnost ze se vyskytnou pripady kdy se
> > takova chyba prenese dokonce na pozici druhou. 
> 
> Když program napíšu blbě, tak opravdu ano.
> 
> 
> 
> > Btw. nevim ktere jazyky pocitate za vetsinu. Delphi a C#
> > temito neduhy netrpi.
> 
> Trpí jimi všechny programovací jazyky, protože všechny jazyky 
> používají v počítači stejný koprocesor, který tyhle výpočty 
> provádí. Jediný rozdíl je v tom, jakou používáte proceduru 
> pro tisk - pokud používáte v jednom jazyku zaokrouhlovací 
> proceduru a v druhém ne, nemůžete jejich výsledky porovnávat. 
> 
> Začněte v Dephi tisknout s přesností na 15 desetinných míst a 
> budete dostávat stejné výsledky jako u prinln v Javě. 
> Budete-li naopak používat formátovaný výstup v Javě, vůbec 
> takovéte drobné odchylky nezaznamenáte.
> 
> Používejte printf a porovnávejte hodnoty korektně a máte po 
> starostech.
> 
> 
> 
> -- 
> No virus found in this outgoing message.
> Checked by AVG Free Edition.
> Version: 7.1.375 / Virus Database: 268.0.0/267 - Release 
> Date: 22.02.06 st
>  
> 
> 


Odpovedet emailem