Это из-за округления.
1 может быть представлено точно как двойной или поплавок, поэтому первые 4 сравнения работают так, как ожидалось.
1.1 == 1.1
сравнивает двойное с самим собой и работает должным образом.
1.1d == 1.1
точно такой же, как указано выше (d
подразумевается в).
В последних двух сравнениях сравниваются 1.1 двойные по 1.1 поплавка. За исключением того, что 1.1
не является точно представимым как float (соответственно double), поэтому он округляется до ближайшего поплавка (соответственно двойного), но double имеет «более высокое разрешение», поэтому они не округляются одинаково.
Чтобы увидеть точные значения:
System.out.println(new BigDecimal(1.1f)); //1.10000002384185791015625
System.out.println(new BigDecimal(1.1d)); //1.100000000000000088817841970012523233890533447265625
Как было предложено @yshavit в комментариях, когда вы сравниваете двойной поплавок, поплавок преобразуется в двойной (due to numeric promotion), так вы действительно сравнения двух дублей:
System.out.println(new BigDecimal((double) 1.1f)); //1.10000002384185791015625
System.out.println(new BigDecimal(1.1d)); //1.100000000000000088817841970012523233890533447265625
Очень хорошие объяснения: https://randomascii.wordpress.com/2012/06/26/doubles-are-not-floats- so-dont-compare-them/ –
Вы ДОЛЖНЫ прочитать [Что должен знать каждый компьютерный ученый о арифметике с плавающей точкой] (https://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html) ,Это канонический ресурс для этого. –
В чем смысл проверки равенства для двух разных типов значений ... неважно .. – haifzhan