Java math.round function

Java Math.Round()

Oct 30, 2017 Java, Java Math comments

Math.Round Examples

Round Float Values

public static int round(float a)
float num1 = 14.4f;
float num2 = 14.6f;
int roundedNum1 = Math.round(num1);
int roundedNum2 = Math.round(num2);
System.out.println(roundedNum1);
System.out.println(roundedNum2);
14
15

If we make it negative values, for example:

float num1 = -14.4f;
float num2 = -14.6f;
int roundedNum1 = Math.round(num1);
int roundedNum2 = Math.round(num2);
System.out.println(roundedNum1);
System.out.println(roundedNum2);
-14
-15
  • If the argument is NaN, the result is 0. — since a float number can have the value Nan, the converted value will be 0 for such case. Example, consider this code:
    float num = Float.NaN;
    System.out.println(num);
    int roundedNum = Math.round(num);
    System.out.println(roundedNum);
    

    Will have this output:

    NaN
    0
    
  • If the argument is negative infinity or any value less than or equal to the value of Integer.MIN_VALUE, the result is equal to the value of Integer.MIN_VALUE. — The value of Integer.MIN_VALUE is -2147483648, which is the lowest value that this method can return. Example:
    float num = -1/0.0f;
    int roundedNum = Math.round(num);
    System.out.println(num);
    System.out.println(roundedNum);
    

    We produce a negative infinity number by dividing a negative number by 0. The rounded value of that is the Integer.MIN_VALUE. The output of the code therefore will be:

    -Infinity
    -2147483648
    
  • If the argument is positive infinity or any value greater than or equal to the value of Integer.MAX_VALUE, the result is equal to the value of Integer.MAX_VALUE. — The value of Integer.MAX_VALUE is 2147483647, which is the biggest value that this method can return.
    float num = 1/0.0f;
    int roundedNum = Math.round(num);
    System.out.println(num);
    System.out.println(roundedNum);
    

    We produce infinity number by dividing a positive number by 0. The rounded value of that is the Integer.MAX_VALUE. The output of the code above will be:

    Infinity
    2147483647
    

Round Double Values

public static long round(double a)
double num1 = 52147483647.4d;
double num2 = 52147483647.6d;
long roundedNum1 = Math.round(num1);
long roundedNum2 = Math.round(num2);
System.out.println(roundedNum1);
System.out.println(roundedNum2);
52147483647
52147483648

If we make it negative values, for example:

double num1 = -52147483647.4d;
double num2 = -52147483647.6d;
long roundedNum1 = Math.round(num1);
long roundedNum2 = Math.round(num2);
System.out.println(roundedNum1);
System.out.println(roundedNum2);
-52147483647
-52147483648

Edge cases are also similar:

  • If the argument is NaN, the result is 0. — The behavior is similar as described above, example code:
    double num = Double.NaN;
    long roundedNum = Math.round(num);
    System.out.println(num);
    System.out.println(roundedNum);
    

    the output is:

    NaN
    0
    

If the argument is negative infinity or any value less than or equal to the value of Long.MIN_VALUE, the result is equal to the value of Long.MIN_VALUE. — Similarly, the lowest value that this method will return is Long.MIN_VALUE or -9223372036854775808. See this code sample:

double num = Double.NEGATIVE_INFINITY;
long roundedNum = Math.round(num);
System.out.println(num);
System.out.println(roundedNum);

the output is:

-Infinity
-9223372036854775808

If the argument is positive infinity or any value greater than or equal to the value of Long.MAX_VALUE, the result is equal to the value of Long.MAX_VALUE. — And as expected, the highest value that this method will return is Long.MAX_VALUE or 9223372036854775807. See this code sample:

double num = Double.POSITIVE_INFINITY;
long roundedNum = Math.round(num);
System.out.println(num);
System.out.println(roundedNum);

the output is:

Infinity
9223372036854775807

Математические вычисления и класс Math

Последнее обновление: 28.10.2018

Для выполнения различных математических операций в Java в пакете java.lang определен класс
Math. Рассмотрим его основные методы:

  • : возвращает абсолютное значение для аргумента value

    double result = Math.abs(-13.5); // 13.5
    
  • : возвращает арккосинус value. Параметр value должен иметь значение от -1 до 1

    double result = Math.acos(1); // 0.0
    
  • : возвращает арксинус value. Параметр value должен иметь значение от -1 до 1

  • : возвращает арктангенс value

  • : возвращает кубический корень числа value

    double result = Math.cbrt(27); // 3
    
  • : возвращает наименьшее целое число с плавающей точкой, которое не меньше value

    double result = Math.ceil(2.34); // 3
    
  • : возвращает косинус угла d

  • : возвращает гиперболический косинус угла d

  • : возвращает основание натурального логарифма, возведенное в степень d

  • : возвращает наибольшее целое число, которое не больше d

    double result = Math.floor(2.56); // 2
    
  • : возвращает целочисленный результат деления a на b

    System.out.println(Math.floorDiv(1, 2)); // 0
    System.out.println(Math.floorDiv(7, 2)); // 3
    System.out.println(Math.floorDiv(9, 2)); // 4
    
  • : возвращает натуральный логарифм числа a

  • : возвращает натуральный логарифм числа (d + 1)

  • : возвращает десятичный логарифм числа d

  • : возвращает максимальное число из a и b

  • : возвращает минимальное число из a и b

  • : возвращает число a, возведенное в степень b

  • : возвращает случайное число от 0.0 до 1.0

  • : возвращает число double, которое представляет ближайшее к числу value целое число

    System.out.println(Math.rint(2)); // 2.0
    System.out.println(Math.rint(2.3)); // 2.0
    System.out.println(Math.rint(2.5)); // 2.0
    System.out.println(Math.rint(2.5001)); // 3.0
    System.out.println(Math.rint(2.8)); // 3.0
    
  • : возвращает число d, округленное до ближайшего целого числа

    System.out.println(Math.round(2.3)); // 2
    System.out.println(Math.round(2.5)); // 3
    System.out.println(Math.round(2.5001)); // 3
    System.out.println(Math.round(2.8)); // 3
    
  • : возвращает произведение числа value на 2 в степени factor

    System.out.println(Math.scalb(5, 3)); // 5*2*2*2 = 40
    System.out.println(Math.scalb(3, 4)); // 3*2*2*2*2 = 48
    
  • : возвращает число 1, если число value положительное, и -1, если значение value отрицательное. Если value равно 0, то возвращает 0

    System.out.println(Math.signum(2.3)); // 1
    System.out.println(Math.signum(-2.3)); // -1
    
  • : возвращает синус угла value

  • : возвращает гиперболический синус угла value

  • : возвращает квадратный корень числа value

    double result1 = Math.sqrt(16); // 4
    
  • : возвращает тангенс угла value

  • : возвращает гиперболический тангенс угла value

  • переводит радианы в градусы и — градусы в радианы

    System.out.println(Math.toDegrees(3.14159)); // 180
    System.out.println(Math.toRadians(90)); // 1,57079....
    

Также класс Math определяет две константы: и . Например, вычислим площадь круга:

import java.util.Scanner;

public class Program {
  
    public static void main(String[] args) {
          
        Scanner in = new Scanner(System.in);
        
        System.out.print("Введите радиус круга: ");
        int radius = in.nextInt();
        long area = Math.round(Math.PI * Math.pow(radius, 2));
        System.out.printf("Площадь круга с радиусом %d равна %d \n", radius, area);
    }
}

Консольный вывод:

Введите радиус круга: 10
Площадь круга с радиусом 10 равна 314

НазадВперед

Класс Java Math

Класс Java Math предоставляет более сложные математические вычисления, чем те, которые предоставляют базовые математические операторы Java. Класс Math содержит методы для:

  • нахождения максимального или минимального значений;
  • значений округления;
  • логарифмических функций;
  • квадратного корня;
  • тригонометрических функций (sin, cos, tan и т. д.).

Math находится в пакете java.lang, а не в пакете java.math. Таким образом, полное имя класса Math — это java.lang.Math.

Поскольку многие его функции независимы друг от друга, каждый метод будет объяснен в своем собственном разделе ниже.

Встроенные функции

Для операции округления в Python есть встроенные функции – и

round

– округляет число (number) до ndigits знаков после запятой. Это стандартная функция, которая для выполнения не требует подключения модуля math.

По умолчанию операция проводится до нуля знаков – до ближайшего целого числа. Например:

Чтобы получить целый показатель, результат преобразовывают в .

Синтаксически функция вызывается двумя способами.

  1. – это округление числа до целого, которое расположено ближе всего. Если дробная часть равна 0,5, то округляют до ближайшего четного значения.
  2. – данные округляют до знаков после точки. Если округление проходит до сотых, то равен «2», если до тысячных – «3» и т.д.

int

– встроенная функция, не требующая подключения дополнительных модулей. Её функция – преобразование действительных значений к целому путем округления в сторону нуля. Например

Для положительных чисел функция аналогична функции , а для отрицательных – аналогично . Например:

Чтобы число по int преобразовать по математическим правилам, нужно выполнить следующие действия.

  1. Если число положительное, добавить к нему 0,5.
  2. Если число отрицательное, добавить -0,5.

Синтаксически преобразование оформляется так:

Java Integer Math

Математические операции, выполняемые с целочисленными типами Java (byte, short, int и long), ведут себя немного иначе, чем обычные математические операции. Поскольку целочисленные типы не могут содержать дроби, в каждом вычислении с одним или несколькими целочисленными типами все дроби в результате обрезаются. Посмотрите на это математическое выражение:

int result = 100 / 8;

Результат этого деления будет 12,5, но так как два числа являются целыми числами, фракция .5 обрезается. Результат, следовательно, всего 12.

Округление также происходит в подрезультатах больших вычислений.

С плавающей точкой Math

Java содержит два типа данных с плавающей точкой: float и double. Они могут содержать дроби в числах. Если нужны дробные выражения в математических выражениях, вы должны использовать один из этих типов данных. Вот пример математического выражения с плавающей точкой:

double result = 100 / 8;

Несмотря на то, что переменная результата теперь имеет тип с плавающей запятой (double), конечный результат по-прежнему равен 12 вместо 12,5. Причина в том, что оба значения в математическом выражении (100 и 8) оба являются целыми числами. Таким образом, результат деления одного на другое сначала преобразуется в целое число (12), а затем присваивается переменной результата.

Чтобы избежать округления вычислений, необходимо убедиться, что все типы данных, включенные в математическое выражение, являются типами с плавающей запятой. Например, вы могли бы сначала присвоить значения переменным с плавающей запятой следующим образом:

double no1 = 100;
double no2 = 8;

double result = no1 / no2;

Теперь переменная результата будет иметь значение 12,5.

В Java есть способ заставить все числа в расчете быть переменными с плавающей точкой. Вы ставите числа с большой буквы F или D. Вот пример:

double result = 100D / 8D;

Обратите внимание на прописные буквы D после каждого числа. Этот верхний регистр D говорит Java, что эти числа должны интерпретироваться как числа с плавающей запятой, и, таким образом, деление должно быть делением с плавающей запятой, которое сохраняет дроби вместо их обрезания

На самом деле вы также можете сделать число длинным, добавив суффикс числа к верхнему регистру L, но long по-прежнему является целочисленным типом, поэтому он не будет сохранять дробные части в вычислениях.

Точность с плавающей точкой

Типы данных с плавающей точкой не являются точными на 100%. Вы можете столкнуться с ситуациями, когда числа со многими дробями не складываются с ожидаемым числом. Если вычисление с плавающей запятой приводит к числу с большим количеством дробей, чем может обработать число с плавающей запятой или двойное число, дроби могут быть обрезаны. Конечно, заданная точность может быть более чем достаточной для многих типов вычислений, но имейте в виду, что дроби могут фактически быть отсечены.

Посмотрите:

double resultDbl3 = 0D;
System.out.println("resultDbl3 = " + resultDbl3);

for(int i=0; i<100; i++){
    resultDbl3 += 0.01D;
}
System.out.println("resultDbl3 = " + resultDbl3);

Вывод выводится при выполнении этого кода с Java 8:

resultDbl3 = 0.0
resultDbl3 = 1.0000000000000007

Первый оператор System.out.println() правильно печатает значение 0.0, которое является начальным значением переменной resultDbl3.

Однако второй оператор System.out.println() выводит несколько странный результат. Добавление значения 0,01 к 0 всего 100 раз должно привести к значению 1,0, верно? Но каким-то образом окончательный результат 1.0000000000000007. Как видите, что-то не так во фракциях.

Обычно неточность с плавающей запятой незначительна, но все же важно знать об этом

Округление чисел с плавающей запятой с помощью DoubleRounder

DoubleRounder — это утилита из библиотеки decimal4j. Она предоставляет быстрый метод округления double чисел до 18 знаков после запятой.

Последнюю версию библиотеки можно найти здесь. Чтобы подключить ее, добавьте зависимость в файл pom.xml:

<dependency>
    <groupId>org.decimal4j</groupId>
    <artifactId>decimal4j</artifactId>
    <version>1.0.3</version>
</dependency>

Пример использования утилиты:

DoubleRounder.round(PI, 3);

Но DoubleRounder дает сбой в нескольких сценариях. Например:

System.out.println(DoubleRounder.round(256.025d, 2));
// OUTPUTS: 256.02 вместо ожидаемого 256.03

Тригонометрические функции

Класс Java Math содержит набор тригонометрических функций. Эти функции могут вычислять значения, используемые в тригонометрии, такие как синус, косинус, тангенс и т. д.

Mathkpi

Константа Math.PI представляет собой двойное значение, значение которого очень близко к значению PI — математическому определению PI.

Math.sin()

Метод Math.sin() вычисляет значение синуса некоторого значения угла в радианах:

double sin = Math.sin(Math.PI);
System.out.println("sin = " + sin);

Math.cos()

Метод Math.cos() вычисляет значение косинуса некоторого значения угла в радианах:

double cos = Math.cos(Math.PI);
System.out.println("cos = " + cos);

Math.tan()

Метод Math.tan() вычисляет значение тангенса некоторого значения угла в радианах:

double tan = Math.tan(Math.PI);
System.out.println("tan = " + tan);

Math.asin()

Метод Math.asin() вычисляет значение синусоиды значения от 1 до -1:

double asin = Math.asin(1.0);
System.out.println("asin = " + asin);

Math.acos()

Метод Math.acos() вычисляет значение арккосинуса от 1 до -1:

double acos = Math.acos(1.0);
System.out.println("acos = " + acos);

Math.atan()

Метод Math.atan() вычисляет значение арктангенса для значения от 1 до -1:

double atan = Math.atan(1.0);
System.out.println("atan = " + atan);

Вот что говорит JavaDoc:

Если вам нужен этот метод, пожалуйста, прочитайте JavaDoc.

Math.sinh()

Метод Math.sinh() вычисляет значение гиперболического синуса значения между 1 и -1:

double sinh = Math.sinh(1.0);
System.out.println("sinh = " + sinh);

Math.cosh()

Метод Math.cosh() вычисляет значение гиперболического косинуса от 1 до -1:

double cosh = Math.cosh(1.0);
System.out.println("cosh = " + cosh);

Math.tanh()

Метод Math.tanh() вычисляет значение гиперболического тангенса значения от 1 до -1:

double tanh = Math.tanh(1.0);
System.out.println("tanh = " + tanh);

Math.toDegrees()

Метод Math.toDegrees() преобразует угол в радианах в градусы:

double degrees = Math.toDegrees(Math.PI);
System.out.println("degrees = " + degrees);

Math.toRadians()

Метод Math.toRadians() преобразует угол в градусах в радианы:

double radians = Math.toRadians(180);
System.out.println("radians = " + radians);

Trigonometric Functions

When we have to work with geometric formulas, we always need trigonometric functions; the Math class provides these for us.

Returns the arc sine of the argument received:

The result is an angle in the range –pi/2 to pi/2.

Returns the arc cosine of the argument received:

The result is an angle in the range 0 to pi.

Returns the arc tangent of the argument received:

The result is an angle in the range –pi/2 to pi/2.

4.8. atan2()

Finally, atan2() receives the ordinate coordinate y and the abscissa coordinate x, and returns the angle ϑ from the conversion of rectangular coordinates (x,y) to polar coordinates (r, ϑ):

4.10. toRadians()

On the other hand toRadians() is useful to do the opposite conversion:

Remember that most of the methods we have seen in this section accept the argument in radians, thus, when we have an angle in degrees, this method should be used before using a trigonometric method.

For more examples, have a look in here.

Rounding Doubles With BigDecimal

To round doubles to n decimal places, we can write a helper method:

There is one important thing to notice in this solution – when constructing BigDecimal; we must always use BigDecimal(String) constructor. This prevents issues with representing inexact values.

We can achieve the same by using the Apache Commons Math library:

The latest version can be found .

Once the library is added to the project, we can use the Precision.round() method, which takes two arguments – value and scale:

By default, it is using the same HALF_UP rounding method as our helper method. Therefore, the results should be the same.

Note that we can change rounding behavior by passing the desired rounding method as a third parameter.

Потеря точности при работе с вещественными числами

При работе с вещественными числами всегда нужно иметь в виду, что вещественные числа не точные. Всегда будут ошибки округления, ошибки преобразования из десятичной системы в двоичную и, наконец, самое частое – потеря точности при сложении/вычитании чисел слишком разных размерностей.

Последнее — самая неожиданная ситуация для новичков в программировании.

Если из числа вычесть , мы получим опять .

Вычитание чисел слишком разных размерностей Объяснение
Второе число слишком маленькое, и его значащая часть игнорируется (выделено серым). Оранжевым выделены 15 значащих цифр.

Что тут сказать, программирование — это не математика.

Интересный факт о strictfp

В Java есть специальное ключевое слово (strict floating point), которого нет в других языках программирования. И знаете, зачем оно нужно? Оно ухудшает точность работы с вещественными числами. История его появления примерно такова:

Создатели Java:

Мы очень хотим, чтобы Java была суперпопулярна, и программы на Java выполнялись на как можно большем количестве устройств. Поэтому мы прописали в спецификацию Java-машины, что на всех типах устройств все программы должны выполняться одинаково!

Создатели процессора Intel:

Ребята, мы улучшили наши процессоры, и теперь все вещественные числа внутри процессора будет представлены не 8-ю, а 10-ю байтами. Больше байт — больше знаковых цифр. А это значит что? Правильно: теперь ваши научные вычисления будут еще более точными!

Ученые и все, кто занимается сверхточными расчетами:

Круто! Молодцы. Отличная новость.

Создатели Java:

Не-не-не, ребята. Мы же сказали: все Java-программы должны выполняться одинаково на всех устройствах. Принудительно выключаем возможность использования 10 байтовых вещественных чисел внутри процессоров Intel.

Вот теперь все опять отлично! Не благодарите.

Ученые и все, кто занимается сверхточными расчетами:

Да вы там совсем охренели? Ану быстро вернули все как было!

Создатели Java:

Ребята, это для вашей же пользы! Только представьте: все Java-программы выполняются одинаково на всех устройствах. Ну круто же!

Ученые и все, кто занимается сверхточными расчетами:

Нет. Совсем не круто. Быстро вернули все обратно! Или мы вашу Java вам знаете куда засунем?

Создатели Java:

Гм. Что же вы сразу не сказали. Конечно, вернем.

Вернули возможность пользоваться всеми фичами крутых процессоров.

Кстати. Мы так же специально добавили в язык слово : если его написать перед именем функции, вся работа с вещественными числами внутри этой функции будет одинаково плохой на всех устройствах!

Знакомство с BigDecimal

Из примеров в предыдущем разделе должно стать ясным, что необходимы две вещи:

1.Возможность задать масштаб, который представляет собой количество цифр после десятичной точки

2.Возможность задать метод округления

Класс java.math.BigDecimal принимает во внимание оба этих соображения. Смотрите документацию по BigDecimal

Создать BigDecimal из (скалярного) числа типа double просто:

bd = new BigDecimal(1.0);

Чтобы создать BigDecimal из Double, сначала воспользуйтесь методом doubleValue().

Однако лучшей идеей является создание из строки:

bd = new BigDecimal(«1.5»);

Если этого не сделать, то результат будет следующим:

bd = new BigDecimal(1.5);

bd.toString(); // => 0.1499999999999999944488848768742172978818416595458984375

Пример проблем при учёте финансов

Денежные расчёты требуют точности в заданной степени, например, для большинства валют это два знака после запятой. Они также требуют определённого типа поведения при округлении, например, в случае налогов всегда выполнять округление в большую сторону.

Например, предположим, что у нас есть продукт, который стоит 10.00 в заданной валюте и местный налог с продаж 0.0825, или 8.25%. Если посчитать налог на бумаге, сумма будет:

10.00 * 0.0825 = 0.825

Поскольку точность расчёта для данной валюты две цифры после запятой, требуется округлить число 0.825. Кроме того, поскольку это налог, обычной практикой является постоянное округление до цента в большую сторону. Таким образом, после расчёта баланса по счетам в конце дня мы никогда не получим недоплату налогов.

0.825 -> 0.83

И таким образом клиенту выставляется общий счёт на сумму 10.83 в местной валюте, а сборщику налогов выплачивается 0.83

Обратите внимание, что если продать 1000 таких продуктов, то переплата сборщику налогов была бы:. 1000 * (0.83 — 0.825) = 5.00

1000 * (0.83 — 0.825) = 5.00

100.0 * 0.528361 = 52.8361

Так как это не налог, можно округлить эту цифру вверх или вниз на своё усмотрение. Предположим, округление выполняется в соответствии со стандартными правилами округления: если следующая значащая цифра меньше 5, округляем в меньшую сторону. В противном случае округляем вверх. Это даёт для окончательной цены значение 52.84.

Теперь предположим, что мы хотим дать рекламную скидку в размере 5% от всей покупки. Делать скидку с цифры 52.8361 или 52.84? Какова разница?

Расчёт 1: 52.8361 * 0.95 = 50.194295 = 50.19

Расчёт 2: 52.84 * 0.95 = 50.198 = 50.20

Обратите внимание, что окончательная цифра округлена по стандартному правилу округления. Видите разницу в один цент между двумя цифрами? Старый код не беспокоился о принятии во внимание округления, поэтому он всегда делал вычисления как в Расчёте 1

Но в новом коде перед расчётом скидок, налогов и всего другого сначала выполняется округление, как и в Расчёте 2. Это одна из главных причин для ошибки в один цент

Видите разницу в один цент между двумя цифрами? Старый код не беспокоился о принятии во внимание округления, поэтому он всегда делал вычисления как в Расчёте 1. Но в новом коде перед расчётом скидок, налогов и всего другого сначала выполняется округление, как и в Расчёте 2

Это одна из главных причин для ошибки в один цент.

Java Math.round on Array example

In this Java program, we find the rounded values of bulk data. Here, we are going to declare an array of double type and find the closest (rounded) values of array elements using java math.round.

Within this Java round example, we declared an Array of double type and assigned some random values.

Next, We used the Java For Loop to iterate the Array. Within the For Loop, we initialized the i value as 0.

Next, compiler will check for the condition (i < myArray.length). As along the condition is True statement inside the for loop executed.

TIP: myArray.length finds the length of the Java array.

The following statements will print the output. If you observe the code snippet, we used the round Function directly inside System.out.format statement.

Here, the compiler will call the Java Math.round method ( static long round(double number) ) to find the corresponding closet (rounded) values.

NOTE: To find the closet (rounded) value of a single item, then use: Math.round(myArray)

Экспоненциальные и логарифмические функции

Класс Java Math также содержит набор функций, предназначенных для экспоненциальных и логарифмических вычислений.

Math.exp()

Функция Math.exp() возвращает число Эйлера, возведенное в степень значения, указанного в качестве параметра:

double exp1 = Math.exp(1);
System.out.println("exp1 = " + exp1);

double exp2 = Math.exp(2);
System.out.println("exp2 = " + exp2);

Итог:

exp1 = 2.718281828459045
exp2 = 7.38905609893065

Math.log()

Метод Math.log() предоставляет логарифм данного параметра. Основой для логарифма является число Эйлера. Таким образом, Math.log() предоставляет обратную функцию Math.exp(). Вот пример:

double log1  = Math.log(1);
System.out.println("log1 = " + log1);

double log10 = Math.log(10);
System.out.println("log10 = " + log10);

Вывод:

log1 = 0.0
log10 = 2.302585092994046

Math.log10()

Метод Math.log10 работает подобно методу Math.log(), за исключением того, что использует 10 как основу для вычисления логарифма вместо числа Эйлера:

double log10_1   = Math.log10(1);
System.out.println("log10_1 = " + log10_1);

double log10_100 = Math.log10(100);
System.out.println("log10_100 = " + log10_100);

Вывод:

log10_1 = 0.0
log10_100 = 2.0

Math.pow()

Функция Math.pow() принимает два параметра. Метод возвращает значение первого параметра, возведенное в степень второго параметра. Вот пример:

double pow2 = Math.pow(2,2);
System.out.println("pow2 = " + pow2);

double pow8 = Math.pow(2,8);
System.out.println("pow8 = " + pow8);

Вывод:

pow2 = 4.0
pow8 = 256.0

Другими словами, пример Math.pow() вычисляет значения 2, 2 и 28, которые равны 4 и 256.

Math.sqrt()

Метод Math.sqrt() вычисляет квадратный корень заданного ему параметра:

double sqrt4 = Math.sqrt(4);
System.out.println("sqrt4 = " + sqrt4);

double sqrt9 = Math.sqrt(9);
System.out.println("sqrt9 = " + sqrt9);

Вывод:

sqrt4 = 2.0
sqrt9 = 3.0

Функция SQL ROUND

Функция SQL ROUND(результат_вычислений, n) округляет результат вычислений до n-го знака после запятой.
Округление производится по правилам арифметики.

Если n — отрицательное число (−n), то округление происходит до n-го знака перед запятой. Таким образом,
с помощью функции ROUND можно получить и целое число как результат округления.

Пример 1. В базе данных фирмы есть таблица Staff, содержащая
данные о сотрудниках фирмы. Выведем индивидуальные размеры заработной платы сотрудников:

SELECT Name, Salary
FROM STAFF

Результатом выполнения запроса будет следующая таблица:

Name Salary
Sanders 18357.5
Pernal 15430.0
Marenghi 17506.8
Doctor 12322.8
Factor 16228.7
Junkers 16232.8
Moonlight 21500.6
Aisen 19540.7
MacGregor 15790.8

Для вычисления среднего размера заработной платы пишем запрос:

SELECT AVG(Salary)
FROM STAFF

Получим следующий результат:

AVG(Salary)
16990.06662326389

Для отчётов результат с таким числом знаков после запятой не годится. Округлим результат до второго
знака после запятой с помощью функции ROUND:

SELECT ROUND(AVG(Salary),2)
AS Avg_Salary
FROM STAFF

Результат будет следующим:

Avg_Salary
16990.07

Пример 2. Теперь округлим результат до первого знака до запятой,
применяя в функции ROUND параметр минус единица:

SELECT ROUND(AVG(Salary),−1)
AS Avg_Salary
FROM STAFF

Результат будет следующим:

Avg_Salary
16990

Сместим округление ещё на один знак влево и применим в функции ROUND параметр минус 2:

SELECT ROUND(AVG(Salary),−2)
AS Avg_Salary
FROM STAFF

Результат будет следующим:

Avg_Salary
17000

Функция SQL ROUND может применяться ещё и с третьим необязательными параметром
(кроме MySQL). Если этим параметром будет 1, то округление производиться не будет, просто в результате
будет оставлено столько знаков после запятой, сколько указано во втором параметре.

Пример 3. Оставить в результате вычислений средней заработной
платы два знака после запятой, не производя округления. Применяем функцию ROUND с тремя параметрами:

SELECT ROUND(AVG(Salary),2,1)
AS Avg_Salary
FROM STAFF

Результат будет следующим:

Avg_Salary
16990.06

Функция MySQL TRUNCATE

В MySQL аналогом разновидности функции ROUND без округления результата является функция TRUNCATE.
Она, как и ROUND в общем случае имеет два параметра: результат вычислений и число знаков после запятой.

Пример 4. Условие то же, что в примере 3, но в MySQL. Применяем
функцию TRUNCATE:

SELECT TRUNCATE(AVG(Salary),2)
AS Avg_Salary
FROM STAFF

Получим результат без округления, как в предыдущем примере:

Avg_Salary
16990.06

Функции из библиотеки Math

Модуль необходим в Python. Он предоставляет пользователю широкий функционал работы с числами. Для обработки алгоритмов сначала проводят импорт модуля.

math.ceil

Функция преобразовывает значение в большую сторону (вверх). Этот термин применяется и в математике. Он означает число, которое равно или больше заданного.

Любая дробь находится между двумя целыми числами. Например, 2.3 лежит между 2 и 3. Функция ceil() определяет большую сторону и возводит к нему результат преобразования. Например:

Алгоритм определяет большую границу интервала с учетом знака:

math.floor

действует противоположно – округляет дробное значение до ближайшего целого, которое меньше или равно исходному. Округление происходит в меньшую сторону (вниз):

При округлении учитывается знак перед данными.

math.trunc

Функция характеризуется отбрасыванием дробной части. После преобразования получается целое значение без учета дроби. Такой алгоритм не является округлением в арифметическом смысле. В Пайтон просто игнорируется дробь независимо от ее значения:

Избавиться от дроби можно без подключения модуля. Для этого есть стандартная функция Она преобразовывает дробные числа в целые путем игнорирования дроби.

Rounding and Other Functions

Finally, let’s have a look at rounding methods.

5.1. ceil()

ceil() is helpful when we have to round an integer to the smallest double value that is greater than or equal to the argument:

In this article, we use this method to round up a number to the nearest hundred.

Returns an unbiased exponent of the argument.

The argument can be a double or a float:

5.4. IEEEreminder()

Computes the division between the first (dividend) and the second (divisor) argument and returns the remainder as prescribed by the IEEE 754 standard:

5.5. nextAfter()

This method is useful when we need to know the neighboring of a double or a float value:

It accepts two arguments, the first is the value of which you want to know the adjacent number and the second is the direction.

5.8. round()

Equally to the above method, but this one returns an int value if the argument is a float and a long value if the argument is a double:

5.9. scalb()

Scalb is an abbreviation for a “scale binary”. This function executes one shift, one conversion and a double multiplication:

5.11. hypot()

Returns the square root of the sum of squares of its argument:

The method calculates the square root without intermediate overflow or underflow.

In this article, we use this method to calculate the distance between two points.

Где делать округление: размышления о точности

Теперь, когда есть возможность управлять округлением расчёта, до какого знака следует округлять? Ответ зависит от того, как планируется использовать полученное число.

Вам известна требуемая точность конечного результата из потребностей пользователей. Для чисел, которые будут складываться и вычитаться для получения конечного результата, необходимо добавить ещё один десятичный разряд, так что сумма 0.0144 + 0.0143 будет округлена до 0.03, в то время как если округление выполняется до 0.01, результатом будет 0.02.

Если необходимы числа, которые будут умножаться для получения конечного результата, необходимо сохранять столько знаков после запятой, сколько возможно. Например, коэффициенты и удельные затраты не должны округляться. После умножения необходимо округлять конечный результат.

Алгебраические функции в Java

В большинстве случаев программисту с головой хватает школьной математики: даже синусы и косинусы в коде можно встретить очень редко. Чаще всего они нужны при работе с играми, картами или игровыми движками. 90% программистов с этим никогда не сталкиваются.

Но, кроме геометрии, программистам иногда приходится использовать и алгебраические функции. И, конечно же, класс содержит самые распространенные из них:

Метод Описание
квадратный корень из
кубический корень из
возведение в степень:
экспонента:
натуральный логарифм :
десятичный логарифм :
натуральный логарифм :

Если вам нужен квадратный или кубический корень из числа, для этого есть функции и .

Корень из двух можно вычислить так:

Если вы хотите получить корень более высокой степени, воспользуйтесь функцией возведения в степень: в степени — это и будет корень четвертой степени, и т.д.

Для работы с логарифмами и экспонентами есть функции – натуральный логарифм и — экспонента. Для вычисления десятичного логарифма есть функция .

Если вам нужен логарифм числа по основанию , воспользуйтесь простой формулой:

Полезные функции

Последние две функции и могут быть вам полезны, если вы проводите вычисления при очень маленьких значениях .

При сложении очень маленьких и очень больших переменных часто может возникнуть ситуация, когда очень маленькое значение просто игнорируется (отбрасывается) как незначащее. Это, собственно, и будет происходить, если использовать функции и . Поэтому программисты придумали функции, которые возвращают только ту самую «маленькую значащую часть»

Пример:

Вы хотите посчитать натуральный логарифм от , где равен . Вы просто не сможете передать это число в функцию , т.к. если сложить и , получится . — настолько маленькое число, что будет отброшено полностью при сложении чисел.

А т.к. в математике часто приходится вычислять при числах, близких к , программисты придумали способ обойти эту проблему: передать в функцию не само число, а только его отличие от .

Оцените статью
Рейтинг автора
5
Материал подготовил
Илья Коршунов
Наш эксперт
Написано статей
134
Добавить комментарий