Anebo jine priklady z praxe:

1) Zadani: Polozky na fakture jsou kladne i zaporne. Faktura lze
ulozit pouze, kdyz je celkova cena je vetsi nebo rovno nule:
if (0.5 - 0.4 - 0.1 < 0) {
  System.out.println("Nelze");
  // Chyba! Tato faktura by podle zadani mela jit ulozit, a presto to nejde.
}

2) 1m latky stoji 10.12Kc, zakaznik chce 100m. Celkovou cenu
zaokrouhlete dolu na cele koruny.
System.out.println(Math.floor(10.12*100)); // vytiskne 1011.0, tedy
prodejce je osizen o 1Kc

Jako ne prilis spolehlivy workaround lze zaokrouhlovat po kazde
operaci na 2 desetinna cisla, ale to je mozna vetsi vopruz nez ten
BigDecimal (a buh vi, kde by i tento workaround selhal.)

2011/2/8 Josef Cacek <josef.ca...@gmail.com>:
> Ahojte,
>
> 2011/2/8 Libor Jelinek <ljeli...@virtage.com>:
>> To znamená, že bych měl na double a float provždy zapomenout a všechno
>> nahradit třídou BigDecimal (jak doporučuje Oráclí Java Tutorial)?
>
> Nahradit jen tam, kde presnost potrebujete (fakturace apod.). Kdyz ale
> muzete malou odchylku zanedbat a jde vam o rychlost (napr. resite
> matematicke nebo graficke ulohy) na BigDecimal zapomente a pouzijte
> primitivni typy (float, double).
> Jinak pro otestovani desetihalerove aritmetiky s typem float muzete zkusit:
>
> float halere = 0f;
> for (int i = 1; i <= 1000000; i++) {
>    halere += 0.1f;
>    if (i % 1000 == 0) {
>        System.out.println(i / 10 + "~" + halere);
>    }
> }
>
> Na mem openjdk-6 to zacina:
> 100~99.99905
> a konci to
> 100000~100958.34
>
> Za tyto pocty by vam asi zakaznici moc nepodekovali. :-)
>
> -- pepa cacek
>



-- 
Ondra Medek

Odpovedet emailem