Различное округление с помощью println и printf

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

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

Ответ 1

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

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

Таким образом, это похоже на запись типа

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

или

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

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

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

На боковой ноте: -

Также есть класс formatter в Java.

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

Из Документация Oracle

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

Ответ 2

Этот вывод является причиной round half up операции с плавающим форматом %f. Если вы пройдете docs, вы получите

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

Ответ 3

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