Proč nepoužívat double pro přesné výpočty

Čísla s desetinnou čárkou jsou v počítači reprezentována podle standardu IEEE 754. Tato reprezentace ale není přesná což může vést k následujícím situacím.

double x = 0.5;
double y = 0.4;
double z = x - y;

System.out.println("Hodnota z: \t" + z);

Výsledek

Hodnota z: 0.09999999999999998

Další příklad

double mixer = 1099.00;
double mixerPoSleve = mixer * 0.9;
double trouba = 5999.00;
double troubaPoSleve = trouba * 0.9;
double celkovaCena = troubaPoSleve + mixerPoSleve;

System.out.println("mixér po slevě: \t" + mixerPoSleve);
System.out.println("trouba po slevě: \t" + troubaPoSleve);
System.out.println("celková cena: \t\t" + celkovaCena);

Výsledek

mixér po slevě: 989.1
trouba po slevě: 5399.1
celková cena: 6388.200000000001

Řešením je použít datový typ BigDecimal. Zde je s použitím BigDecimal upraven první příklad.

BigDecimal x = new BigDecimal("0.5");
BigDecimal y = new BigDecimal("0.4");
BigDecimal z = x.subtract(y);

System.out.println("Hodnota z: \t" + z);

Výsledek

Hodnota z: 0.1

Napsat komentář