Java: Числа с плавающей точкой
В математике существуют разные виды чисел, например:
- Натуральные — это целые числа от 1 и больше
- Рациональные — это числа с точкой, например, 0.5
С точки зрения устройства компьютеров, между этими видами чисел — пропасть. Попробуем сложить два рациональных числа:
0.2 + 0.1 = 0.3А теперь посмотрим, что на это скажет Java:
0.2 + 0.1; // 0.30000000000000004Операция сложения двух рациональных чисел внезапно привела к неточному вычислению результата. Тот же самый результат выдадут и другие языки программирования.
Такое поведение обуславливается ограничениями вычислительных мощностей. В отличие от чисел, объем памяти конечен — при этом бесконечное количество чисел требовало бы бесконечного количества памяти для своего хранения.
С натуральными числами эта проблема решается простым ограничением по верхней границе. Есть некоторое максимальное число, которое можно ввести:
System.out.println(Integer.MAX_VALUE);
// => 2147483647С рациональными числами такой финт не пройдет. Дело в том, что они не выстроены в непрерывную цепочку, между 0.1 и 0.2 лежит бесконечное множество чисел.
А как тогда хранить рациональные числа? Подавляющее число языков программирования в этом случае опирается на единый стандарт, который описывает как организовывать память в таких случаях.
Разработчикам важно понимать, что операции с плавающими числами неточны, но эту точность можно регулировать. Это значит, что при решении задач с подобными числами необходимо прибегать к специальным трюкам, которые позволяют добиться необходимой точности.
Задание
Вычислите и выведите на экран произведение двух чисел: 0.39 и 0.22
Полезное
Java: Числа с плавающей точкой
В математике существуют разные виды чисел, например:
- Натуральные — это целые числа от 1 и больше
- Рациональные — это числа с точкой, например, 0.5
С точки зрения устройства компьютеров, между этими видами чисел — пропасть. Попробуем сложить два рациональных числа:
0.2 + 0.1 = 0.3А теперь посмотрим, что на это скажет Java:
0.2 + 0.1; // 0.30000000000000004Операция сложения двух рациональных чисел внезапно привела к неточному вычислению результата. Тот же самый результат выдадут и другие языки программирования.
Такое поведение обуславливается ограничениями вычислительных мощностей. В отличие от чисел, объем памяти конечен — при этом бесконечное количество чисел требовало бы бесконечного количества памяти для своего хранения.
С натуральными числами эта проблема решается простым ограничением по верхней границе. Есть некоторое максимальное число, которое можно ввести:
System.out.println(Integer.MAX_VALUE);
// => 2147483647С рациональными числами такой финт не пройдет. Дело в том, что они не выстроены в непрерывную цепочку, между 0.1 и 0.2 лежит бесконечное множество чисел.
А как тогда хранить рациональные числа? Подавляющее число языков программирования в этом случае опирается на единый стандарт, который описывает как организовывать память в таких случаях.
Разработчикам важно понимать, что операции с плавающими числами неточны, но эту точность можно регулировать. Это значит, что при решении задач с подобными числами необходимо прибегать к специальным трюкам, которые позволяют добиться необходимой точности.
Задание
Вычислите и выведите на экран произведение двух чисел: 0.39 и 0.22
Полезное
Ваше упражнение проверяется по этим тестам
import java.io.ByteArrayOutputStream;
import java.io.FileDescriptor;
import java.io.FileOutputStream;
import java.io.PrintStream;
import static org.assertj.core.api.Assertions.assertThat;
class Test {
public static void main(String[] args) {
final var expected = "0.0858";
ByteArrayOutputStream out = new ByteArrayOutputStream();
System.setOut(new PrintStream(out));
App.main(null);
final var actual = out.toString().trim();
System.setOut(new PrintStream(new FileOutputStream(FileDescriptor.out)));
System.out.println(actual);
assertThat(actual).isEqualTo(expected);
}
}Решение учителя откроется через:
20:00
