5.0 просто показывает, что результат точный , поскольку Java понимает, что он ближе к 5.0, чем к любому другому двойнику. Это не означает, что точный результат операции равен точно 5.
Теперь, когда вы запрашиваете модуль, вы можете получить более тонкий уровень детализации, потому что результат не привязан к части "5".
Это не очень хорошее объяснение, но представьте, что у вас был десятичный тип с плавающей точкой с точностью до 4 цифр. Каков результат 1000 / 99,99 и 1000% 99,99?
Ну, реальный результат начинается с 10.001001 - так что вы должны округлить его до 10.00. Тем не менее, остаток 0,10, который вы можете выразить. Итак, еще раз, это выглядит как разделение дает вам целое число, но это не вполне .
Имея это в виду, имейте в виду, что ваш литерал 5,6 на самом деле 5.5999999999999996447286321199499070644378662109375. Теперь ясно, что 28.0 (который * может) быть представлен точно разделенным на это число, не совсем 5.
РЕДАКТИРОВАТЬ: Теперь, если вы выполните результат с десятичной арифметикой с плавающей запятой с использованием BigDecimal
, значение действительно равно точно 5,6, и проблем нет:
import java.math.BigDecimal;
public class Test {
public static void main(String[] args) {
BigDecimal x = new BigDecimal("28.0");
BigDecimal y = new BigDecimal("5.6");
BigDecimal div = x.divide(y);
BigDecimal rem = x.remainder(y);
System.out.println(div); // Prints 5
System.out.println(rem); // Prints 0.0
}
}