Различное округление с 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.
если точность не указана, то значение по умолчанию равно 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, является стандартным математическим поведением округления