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