Различное округление с println и printf

первая строка ниже будет печатать 0.8999999999999999 из-за потери точности, это понятно. Но вторая строка будет печатать 0.9, Я просто не понимаю, почему. Не должно ли быть такой же проблемы с этим расчетом?

System.out.println(2.00-1.10);
System.out.printf("%f",2.00-1.10);

3 ответов


Я думаю, вам чего-то не хватает, как с помощью системы.из.printf (), если вы не явные ширины форматирования, то поведение printf по умолчанию в C (что составляет 6 десятичных знаков, если явно не указано)

поэтому, если вы не укажете какое-либо число до %f тогда по умолчанию будет печатать только 1 символ. Однако, если вы хотите изменить число после запятой, то вам нужно указать его как %.2f, это выведет число до 2 десятичных знаков.

так это похожие на writing like

System.out.printf("%f",2.00-1.10);

или

System.out.printf("%.1f",2.00-1.10);

как общий синтаксис спецификатора формата для float:

%[flags][width][.precision][argsize]typechar 

на стороне записки:-

и есть форматер класс в Java для этого.

интерпретатор для строк формата в стиле printf. Этот класс предоставляет поддержка для обоснования и выравнивания плана, общих форматов для числовые, строковые, дата/время данные, и специфичный для локали вывод. Общие типы Java, такие как byte, BigDecimal и Calendar поддерживаемый. Ограниченная настройка форматирования для произвольных типов пользователей осуществляется через интерфейс Formattable.

С Oracle Docs

если точность не указана, то значение по умолчанию равно 6. Если точность меньше, чем количество цифр, которые появятся после десятичная точка в строке, возвращаемой Плыть.toString (float) или Двойной.toString (double) соответственно, тогда значение будет округлено используя алгоритм round half up.


этот выход из-за причины round half up работа плавающего формата %f. Если вы пройдете через docs, чем вы получите

Если точность не указана, то значение по умолчанию равно 6. Если точность меньше, чем количество цифр, которые появятся после десятичная точка в строке, возвращаемой поплавок.toString (float) или Двойной.toString (double) соответственно, тогда значение будет округлено использование алгоритма round half up.


по моему мнению, формат %f печатает 1 символ. тот факт, что он печатает 0.9, является стандартным математическим поведением округления