Намедни нужно было реализовать логику учёта неких лимитов, получаемых из внешней системы в виде вещественных чисел. Зная, что лимиты могут быть не выставлены (и это ОК), я решил не обкладываться бесконечными
if (limit == null) в коде, а просто принять их равными максимально возможным значениям типа Double. Поскольку недавно решал подобную задачу для целочисленных значений, в качестве этих экстремумов взял константы Double.MIN_VALUE и Double.MAX_VALUE, то есть такие же, как в классе Integer 👌🏼К моему удивлению, на первых же тестах значение
0 не прошло проверку при незаданных лимитах, потому что оказалось... меньше MIN_VALUE 😱Убедившись, что кукушка на месте, я принялся разбираться и выяснил, что в классе
Double константа MIN_VALUE — это, оказывается:A constant holding the smallest positive nonzero value of type `double` (4.9e-324)
, то есть действительно самое маленькое, но положительное число. А наименьшее отрицательное выражено другой константой с противоестественным (для непосвященного взгляда) значением:
public static final double NEGATIVE_INFINITY = -1.0 / 0.0;
Аналогичная константа есть и для положительного числа, и это совсем не то же самое, что
MAX_VALUE. В общем, слово "плавающая" в названии арифметики, похоже, указывает не только на позицию запятой, но и на возможность "поплыть" даже (казалось бы) опытному инженеру. Век живи, век учись 🧑🎓
