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