use BigDecimal instead of float