Как округлить число до N знаков после запятой в Java
В этом коротком руководстве мы узнаем, как округлить число до n знаков после запятой в Java.
2. Десятичные числа в Java
Java предоставляет два примитивных типа, которые мы можем использовать для хранения десятичных чисел: float и double . Двойной тип по умолчанию:
double PI = 3.1415;
Однако мы никогда не должны использовать любой тип для точных значений , таких как валюты. Для этого, а также для округления мы можем использовать класс BigDecimal .
3. Форматирование десятичного числа
Если мы просто хотим напечатать десятичное число с n цифрами после запятой, мы можем просто отформатировать выходную строку:
System.out.printf("Value with 3 digits after decimal point %.3f %n", PI); // OUTPUTS: Value with 3 digits after decimal point 3.142
В качестве альтернативы мы можем отформатировать значение с помощью класса DecimalFormat :
DecimalFormat df = new DecimalFormat("###.###"); System.out.println(df.format(PI));
DecimalFormat позволяет нам явно установить поведение округления, предоставляя больший контроль над выводом, чем String.format(), использованный выше.
4. Округление двойных чисел с помощью BigDecimal
Чтобы округлить double s до n знаков после запятой, мы можем написать вспомогательный метод :
private static double round(double value, int places) if (places 0) throw new IllegalArgumentException(); BigDecimal bd = new BigDecimal(Double.toString(value)); bd = bd.setScale(places, RoundingMode.HALF_UP); return bd.doubleValue(); >
В этом решении следует отметить одну важную вещь; при создании BigDecimal мы всегда должны использовать конструктор BigDecimal(String) . Это предотвращает проблемы с представлением неточных значений.
Мы можем добиться того же результата, используя математическую библиотеку Apache Commons :
dependency> groupId>org.apache.commonsgroupId> artifactId>commons-math3artifactId> version>3.5version> dependency>
Последнюю версию можно найти здесь .
Как только мы добавим библиотеку в проект, мы можем использовать метод Precision.round() , который принимает два аргумента — значение и масштаб:
Precision.round(PI, 3);
По умолчанию он использует тот же метод округления HALF_UP , что и наш вспомогательный метод; следовательно, результаты должны быть одинаковыми.
Обратите внимание, что мы можем изменить поведение округления, передав желаемый метод округления в качестве третьего параметра.
5. Округление двойников с помощью DoubleRounder
DoubleRounder — это утилита в библиотеке decimal4j . Он обеспечивает быстрый и безотходный метод округления двойных значений от 0 до 18 знаков после запятой.
Мы можем получить библиотеку (последнюю версию можно найти здесь ), добавив зависимость в pom.xml :
dependency> groupId>org.decimal4jgroupId> artifactId>decimal4jartifactId> version>1.0.3version> dependency>
Теперь мы можем просто использовать:
DoubleRounder.round(PI, 3);
Однако DoubleRounder дает сбой в нескольких сценариях:
System.out.println(DoubleRounder.round(256.025d, 2)); // OUTPUTS: 256.02 instead of expected 256.03
6. Метод Math.round()
Другой способ округления чисел — использовать метод Math.Round() .
В этом случае мы можем контролировать n количество знаков после запятой, умножив и разделив на 10^n :
public static double roundAvoid(double value, int places) double scale = Math.pow(10, places); return Math.round(value * scale) / scale; >
Этот метод не рекомендуется, так как он усекает значение . Во многих случаях значения округляются неправильно:
System.out.println(roundAvoid(1000.0d, 17)); // OUTPUTS: 92.23372036854776 !! System.out.println(roundAvoid(260.775d, 2)); // OUTPUTS: 260.77 instead of expected 260.78
В результате этот метод указан здесь только в учебных целях.
7. Заключение
В этой статье мы рассмотрели различные способы округления чисел до n знаков после запятой.
Мы можем просто отформатировать вывод без изменения значения или округлить переменную с помощью вспомогательного метода. Мы также обсудили несколько библиотек, решающих эту проблему.
Код, использованный в этой статье, можно найти на GitHub .
Изучаем округление в Java: как в Java округлить число до n знаков после запятой
В этой статье мы рассмотрим, как в Java округлить число до n десятичного знаков.
Десятичные числа в Java
Java предоставляет два примитивных типа, которые могут использоваться для хранения десятичных чисел: float и double . Double — это тип данных, используемый по умолчанию:
double PI = 3.1415
Но оба типа данных не должны использоваться для вычисления точных значений . Например, валютных котировок и округления чисел. Для этого лучше применять класс BigDecimal .
Форматирование десятичного числа
Если нужно вывести десятичное число с n знаками после запятой, можно отформатировать выходную строку:
System.out.printf("Value with 3 digits after decimal point %.3f %n", PI); // Вывод: Значения с 3 знаками после запятой 3.142
Также можно округлить значение с помощью класса DecimalFormat :
DecimalFormat df = new DecimalFormat("###.###"); System.out.println(df.format(PI));
Этот класс позволяет настроить процесс округления числа.
Java: округление Double с помощью BigDecimal
Чтобы округлить тип double до n знаков после запятой, можно написать helper-метод :
private static double round(double value, int places)
Обратите внимание, что при создании экземпляра класса BigDecimal мы должны всегда использовать конструктор BigDecimal(String) . Это позволяет избежать проблем с представлением неточных значений.
Можно сделать то же самое, используя библиотеку Apache Commons Math :
org.apache.commons commons-math3 3.5
Актуальную версию этой библиотеки можно найти здесь. Для округления чисел применяется метод Precision.round() , который принимает два аргумента — значение и масштаб:
Precision.round(PI, 3);
По умолчанию он использует тот же метод округления HALF_UP, что хэлпер. Поэтому результаты должны быть одинаковыми.
Кроме этого можно изменить процесс приведения чисел, передав в качестве третьего параметра необходимый метод округления.
Округление чисел с плавающей запятой с помощью DoubleRounder
DoubleRounder — это утилита из библиотеки decimal4j. Она предоставляет быстрый метод округления double чисел до 18 знаков после запятой.
Последнюю версию библиотеки можно найти здесь. Чтобы подключить ее, добавьте зависимость в файл pom.xml :
org.decimal4j decimal4j 1.0.3
Пример использования утилиты:
DoubleRounder.round(PI, 3);
Но DoubleRounder дает сбой в нескольких сценариях. Например:
System.out.println(DoubleRounder.round(256.025d, 2)); // OUTPUTS: 256.02 вместо ожидаемого 256.03
Метод Math.round() java
При использовании метода Math.round() можно контролировать п -количество десятичных разрядов путем умножения и деления на 10^п :
public static double roundAvoid(double value, int places) < double scale = Math.pow(10, places); return Math.round(value * scale) / scale; >
Этот метод не рекомендуется использовать для округления чисел, поскольку он усекает значение . Во многих случаях значения округляются неправильно:
System.out.println(roundAvoid(1000.0d, 17)); // Вывод: 92.23372036854776 !! System.out.println(roundAvoid(260.775d, 2)); // Вывод: 260.77 вместо ожидаемого 260.78
Заключение
В этой статье мы рассмотрели различные методы округления чисел до n знаков после запятой, доступные в Java.
Можно просто отформатировать вывод без изменения значения или округлить переменную с помощью вспомогательного метода или подключаемых библиотек.
Код, использованный в этой статье, доступен на GitHub.
Ограничение числа знаков после запятой
подскажите пожалуйста, как ограничить вывод знаков после запятой до одного.
System.out.println("Скалярное произведение строк равно "+Float.toString(pr)+"");
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:
Преобразование числа к числу с парочкой знаков после запятой
подскажите пожалуйста многоуважаемый all, а как бы мне переменную типа 0.5736573892197121 привести.
Число десятичных знаков после запятой
После преобразования parseFloat(s) получаю значение 45.6799999992 Есть ли стандартная команда.
Как указать количество знаков после запятой
Всем привет есть программа считает сумму синусов треугольника, вопрос как сделать так чтобы при.
ɐwʎ ɔ vǝmоɔ dиw ɐʚонɔ
443 / 442 / 100
Регистрация: 14.10.2012
Сообщений: 1,146
Записей в блоге: 9
1 2 3 4 5 6
float f = 1.2345678f; System.out.printf("%.1f\n", f); String str; str = String.format("%.1f\n", f); System.out.println(str);
\n перевод строки .1 означает — один знак после точки
![]()
![]()
![]()
12134 / 7392 / 1734
Регистрация: 25.07.2009
Сообщений: 13,559
1 2 3 4 5 6 7 8 9
import java.text.NumberFormat; public class AfterPoint { public static void main(String[] args) { NumberFormat nf = NumberFormat.getInstance(); nf.setMaximumFractionDigits(2); System.out.println("Число Пи примерно равно " + nf.format(22.0 / 7.0)); } }
Округление в Java
Общие и частные методы округления чисел с плавающей запятой. Округление до заданного числа знаком после запятой и целого.
13 ноября 2017 1 минута 75284

Автор статьи
Илья Бубнов

Автор статьи
Илья Бубнов
https://gbcdn.mrgcdn.ru/uploads/post/1301/og_cover_image/3cabc709e813edd8474f4dbcb80648c7
В Java есть целочисленные типы данных (long, int, char, short, byte) и есть типы с плавающей точкой (float, double), а по-русски — «с плавающей запятой» . Преобразование значений с дробной частью в целочисленные полезно для упрощения вычислений, последующего чтения и для сокращения объемов используемой памяти. Сделать это можно так:
double x = 5.6789; int y = (int)x;
Однако полученный результат может отличаться от ожидаемого. В частности, в данном случае y будет равно 5, несмотря на то, что по всем правилам округления должно быть 6. Чтобы избежать этой многозначности, можно воспользоваться «дедовским» способом, без привязки к возможностям языка.
i=(int )(n+0.5); // классическое округление i=(int )(n+1); //округление до большего целого i=(int )(n);// округление до меньшего целого
Однако данная форма записи имеет множество недостатков, от неправильного результата в частных ситуациях до неудобочитаемой записи в целом. Классический метод округления до целого — round. Допустим, дано число n. Тогда для округления запишем:
int result = (int)Math.round(n);
Если n имеет дробную часть менее 0,5, то число округляется в меньшую сторону, в противном случае — в большую. То есть стандартный математический алгоритм.
Если же вам требуется java округление в меньшую сторону — вместо дополнительной математической операции лучше сразу воспользоваться готовой функций FLOOR:
int result = (int)Math.floor(n);
Java округление в большую сторону выполняется методом CEIL:
int result = (int)Math.ceil(n);
Как и в жизни, округлять можно не только до целого числа, но и до определенного знака после запятой. Как и в первом случае, в java округление до сотых можно сделать чисто математически:
n=n*100; int result = (int)Math.round(n); float result2 = (float) result / 100;
Однако запись не слишком удобна, если вам требуется в java округление до плавающего числа знаков с заданным поведением. С помощью методов перечисления RoundingMode() у вас есть такая возможность. Методы следующие:
- UP — округление в сторону большего числа для положительных чисел и меньшего для отрицательных.
- DOWN — округление в сторону меньшего числа для положительных чисел и большего для отрицательных.
- CEILING — округление в сторону большего и для положительных, и для отрицательных чисел.
- FLOOR — округление в сторону меньшего и для положительных, и для отрицательных чисел.
- HALF_UP — округление в большую сторону в случае числа вида 0.5;
- HALF_DOWN — округление в меньшую сторону в случае числа вида 0.5;
- HALF_EVEN — классическое округление
Выглядит подобное округление чисел так:
result1 = result.setScale(2, RoundingMode.HALF_UP);
Цифра в скобках указывает в java округление до 2 знаков double типа.
Специальные методы округления java позволяют разработчику решить любую задачу, не прибегая к грубым мультиязычным способам, содержащим ограничения и ошибки.
