Ошибка вычисления Float/Double в Java

-6

У нас возникают некоторые проблемы с вычислениями (делениями) в Java.

Пример программы, чтобы показать проблему:

public class NumberTest {

public static void main(String[] args) {
System.out.println("Double value: " + 27.8625d);
System.out.println("Float value: " + 27.8625f);
System.out.println("Double value: " + 1000.0d);
System.out.println("Float value: " + 1000.0f);
System.out.println("Double calculation: " + 27.8625d/1000.0d);
System.out.println("Float calculation: " + 27.8625f/1000.0f);
}

}

Выход:

Double value: 27.8625  
Float value: 27.8625
Double value: 1000.0
Float value: 1000.0
Double calculation: 0.027862500000000002
Float calculation: 0.027862499

Я ожидаю, что результат вычислений будет "0.0278625". Почему существует другой результат для расчета с плавающей точкой и двойным вычислением?

С Уважением,

Тим

спросил(а) 2021-01-25T15:47:22+03:00 4 месяца, 3 недели назад
1
Решение
77

Короткий ответ: значение с плавающей запятой сохраняется в формате x * 2 ^ y. float использует меньше места (обычно 4 байта), чем double (обычно 8 байтов), поэтому существует ограниченная точность, которую может хранить каждый из этих типов данных.

Как правило, при работе с плавающей точкой вы должны установить заранее определенную точность. Например, вместо того, чтобы слепо печатать значение toString() для плавающей запятой, отформатируйте их до 5 цифр после десятичной: String.format("%.5f", value)

Но там больше кучи, чтобы узнать о плавающей точке: что каждый компьютерный ученый должен знать о арифметике с плавающей точкой

ответил(а) 2021-01-25T15:47:22+03:00 4 месяца, 3 недели назад
-6

Это связано с тем, что точность обоих вычислений различна. Если вам нужен желаемый результат, чем вы можете использовать


System.out.println(BigDecimal.valueOf(27.8625).divide(BigDecimal.valueOf(1000.0)).doubleValue());

ответил(а) 2021-01-25T15:47:22+03:00 4 месяца, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема