Проблема с добавлением значений Float в Java

У меня есть два значения

5042034.0 
1425837.2

пока я добавляю как ниже

float abc = (float) (5042034.0 + 1425837.2);

Я ожидаю результата 6467871.2

Но я получаю 6467871.0

Как я мог получить 6467871.2 с помощью поплавка?

Я пробовал с

 float c = (float) (1.1 + 2.2) ;

Я получил результат: 3.3

В чем причина этого?

4 ответа

Решение

Пытаться double вместо.

double abc = (double) (5042034.0 + 1425837.2);

Поплавки - это 32-разрядные числа IEEE 754.

5042034,0 больше 2 ^ 22. Это означает, что он заполняет 23 бита мантисы, что является максимумом. Это фактически пропускает завершающий 0. Когда вы пытаетесь добавить его к 1425837.2, он корректирует оба числа:

 10011001110111101110010.00
+  101011100000110101101.0011001100110011001101....
 --------------------------
 11000101011000100011111.0

в двоичной системе Это означает, что .0 а также .2 из 22 бит и пропущены.

Если вы хотите, чтобы ваша арифметика была лучше, используйте double или же BigDecimal вместо float:

double result = 5042034.0d + 1425837.2d;
BigDecimal bd = BigDecimal.valueOf(5042034.0d + 1425837.2d);

Для поддержки ответа @xenteros используйте BigDecimal,

BigDecimal abc = BigDecimal.valueOf(5042034.0 + 1425837.2);
System.out.println(abc);

приведет к 6467871.2,

Еще лучше, используйте double который является примитивным:

double abc = (double) (5042034.0 + 1425837.2);
System.out.println(abc);

NB: Просто подумал внести свой вклад, я знаю, что ОП спросил с помощью поплавка.

Java использует стандарт IEEE 754, который поддерживает 6-7 значащих десятичных цифр. Ваш результат сложения пересекает предел диапазона, поэтому вы получаете такой результат.

Другие вопросы по тегам