Sdscompany.ru

Компьютерный журнал
19 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Метод abs java

Класс Math

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

Класс содержит две константы типа double: E и PI. Все методы в классе Math статичны.

abs(double a) — возвращает абсолютное значение (модуль) числа типа double.

abs(float a) — возвращает абсолютное значение (модуль) числа типа float .

abs(int a) — возвращает абсолютное значение (модуль) числа типа int.

abs(long a) — возвращает абсолютное значение (модуль) числа типа long.

acos(double a) — возвращает арккосинус значения. Возвращенный угол находится в диапазоне от 0 до pi.

asin(double a) — возвращает арксинус значения. Возвращенный угол в диапазоне от -pi/2 до pi/2.

atan(double a) — возвращает арктангенс значения. Возвращенный угол в диапазоне от-pi/2 до pi/2.

cbrt(double a) — возвращает кубический корень аргумента.

ceil(double a) — возвращает наименьшее целое число, которое больше аргумента.

copySign(double magnitude, double sign) — возвращает аргумент с тем же знаком, что у второго аргумента.

copySign(float magnitude, float sign) — возвращает аргумент с тем же знаком, что у второго аргумента.

cos(double a) — возвращает косинус аргумента.

cosh(double x) — возвращает гиперболический косинус аргумента.

decrementExact(int a) — возвращает значение аргумента уменьшенное на единицу.

decrementExact(long a) — возвращает значение аргумента уменьшенное на единицу.

exp(double a) — возвращает экспоненту аргумента.

floor(double a) — возвращает наибольшее целое число, которое меньше или равно аргументу.

hypot(double x, double y) — возвращает длину гипотенузы (sqrt(x 2 +y 2 )).

IEEEremainder(double f1, double f2) — возвращает остаток от деления f1 на f2.

incrementExact(int a) — возвращает значение аргумента увеличенное на единицу.

incrementExact(long a) — возвращает значение аргумента увеличенное на единицу.

log(double a) — возвращает натуральный логарифм (по основанию e).

log10(double a) — возвращает логарифм по основанию 10.

max(double a, double b) — возвращает больший из аргументов.

max(float a, float b) — возвращает больший из аргументов.

max(int a, int b) — возвращает больший из аргументов.

max(long a, long b) — возвращает больший из аргументов.

min(double a, double b) — возвращает меньший из аргументов.

min(float a, float b) — возвращает меньший из аргументов.

min(int a, int b) — возвращает меньший из аргументов.

min(long a, long b) — возвращает меньший из аргументов.

multiplyExact(int x, int y) — возвращает произведение аргументов (x*y).

multiplyExact(long x, long y) — возвращает произведение аргументов (x*y).

negateExact(int a) — возвращает отрицательное значение аргумента.

negateExact(long a) — возвращает отрицательное значение аргумента.

pow(double a, double b) — возвращает значение первого аргумента, возведенное в степень второго аргумента (a b )

random() — возвращает случайное число от 0.0 (включительно) до 1 (не включительно).

rint(double a) — возвращает округленное значение аргумента.

round(double a) — возвращает округленное значение аргумента.

signum(double a) — возвращает знак аргумента.

signum(float a) — возвращает знак аргумента.

sin(double a) — возвращает синус аргумента.

sinh(double a) — возвращает гиперболический синус аргумента.

sqrt(double a) — возвращает квадратный корень аргумента.

subtractExact(int x, int y) — возвращает разность аргументов (x-y).

subtractExact(long x, long y) — возвращает разность аргументов (x-y).

tan(double a) — возвращает тангенс аргумента.

tanh(double a) — возвращает гиперболический тангенс аргумента.

toDegrees() — преобразует радианы в градусы.

toIntExact(long value) — преобразует аргумент типа long в int.

toRadians() — преобразует градусы в радианы.

Java abs Method

The Java abs method is one of the Java Math Library functions, which is to return the absolute (positive) value of the specified expression or an individual number.

Java abs syntax

The basic syntax of the Math.abs in Java Programming language is as shown below:

Number: It can be a number or a valid numerical expression for which you want to find absolute value.

  • If the number argument is positive or negative zero, Java Math abs function will return positive zero.
  • If the number argument is not a number, Java absolute value will return NaN.

Java Programming provides four different abs functions to find the absolute (positive) value of the specified expression.

The following java abs function will accept positive or negative integer value as an argument and returns the absolute value of the integer type.

The below Java absolute function will accept positive or negative double value as an argument and returns the absolute value of double type.

The following math abs function will accept positive or negative float value and returns the absolute value of float type.

The following Java absolute value function accepts a positive or negative long value. It returns the absolute value of Long type.

Java abs example

In this Java program, We use Java abs Method to find the Java absolute values of different data types and display the output.

OUTPUT

ANALYSIS

First, We used the Math.abs Function directly on both the Positive integer and negative integer. The following statements will call the abs method of integer type ( static int abs(integer x) ) and find the corresponding absolute values.

Here, we used the Java absolute value Function on variable b and c (they belong to double type). The following statements will call the abs method of double type ( static double abs(double x) ) and finds corresponding absolute values.

Next, We used the Java Math abs Function on variable d and e (they belong to float type). The following statements will call the abs method of float type ( static float abs(float x) ) and find the corresponding absolute values.

Next, We used the Math.abs Function on variable f and g (they belong to long type). The below statements will call the math.abs function of long type ( static long abs(long x) ) to find the corresponding absolute values.

Java abs on Array example

In this Java program, we find the absolute values of bulk data. Here, we are going to declare an array of integer types and find the absolute values of array elements.

OUTPUT

ANALYSIS

In this Java abs array example, First, We declared an Array of integer 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

ANALYSIS

In this Java abs array list program, we used the For Loop to iterate the ArrayList

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

Here, the compiler will call the abs method of integer type ( static int abs(integer x) ) to find the corresponding absolute values in Java.

Читать еще:  Заполнение двумерного массива java

Метод abs java

В уроке 8 мы затронули логические операторы, они нам были необходимы для формирования логического выражения в условиях if. Этот урок будет посвящен математике в Java, и поэтому мы рассмотрим подробнее арифметические операторы и частично возможности класса Math.

Но для начала, выясним, что же такое операторы. Операторы это специальные символы, отвечающие за ту или иную операцию, например сложение, умножение, сравнение. Все операторы в Java можно разбить на 4 класса — арифметические, битовые, операторы сравнения и логические.

Арифметические операторы в Java

Для стандартных арифметических операций, таких как сложение, вычитание, умножение, деление в Java используются традиционные символы, к которым мы привыкли со школы:

Примечание: при операции деления, если оба аргумента являются целыми числами, то в результате получим целое число. Дробная часть, если такая имеется, отбросится. Если хотим получить число с дробной частью, то нужно, чтобы один из аргументов был типа double. Это можно указать в самом выражении при помощи добавления после числа .0 или .d. Пример:

В Java также имеется специальный оператор %, обозначающий остаток от делния.

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

Операции с присваиванием

Рассмотрим задачу вывода на экран 10 первых четных чисел чисел

мы можем записать сокращенно

+= это оператор сложения с присваиванием. Подобные операторы есть для всех основных 5 операций, рассмотренных выше

Пример использования: Найти факториал числа 7.

Инкрементирование и декрементирование

Инкремент, обозначается ++ и увеличивает значение переменной на единицу. Декремент обозначается — и уменьшает значение на единицу. С инкрементом и декрементом мы часто встречаемся в цикле for.

Инкремент и декремент бывают двух форм

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

В первом случае сначала переменная a увеличится на 1, потом произойдет вычисление всего выражения. Во втором случае произойдет вычисление выражения при старом значении b = 3, и после вычисления b увеличится на 1, на результат в postfix это уже не повлияет.

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

Вопрос: чему в итоге равны x и y? После того, как вы сделали предположение, проверьте его в java.

Задача со зведочкой. Дан код:

Какие числа будут выведены на экран? Почему? Разобраться самостоятельно.

Примечание: инкремент и декремент применяются только к переменной. Выражение вида 7++ считается недопустимым.

Математические функции и константы (класс Math)

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

Блог только про Java

Учимся программировать на Java с нуля

Главное меню

Перегрузка методов класса в Java

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

Перегрузка методов является одним из способов реализации принципа полиморфизма в Java.

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

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

Конечно, пе­регружаемые методы могут иметь разные возвращаемые типы, но при вызове метода выполняется лишь тот его вариант, в котором параметры соответствуют передаваемым аргументам.

Ниже приведен простой пример программы, демонстрирующий перегрузку методов.

Выполнение этой программы дает следующий результат:

Как видите, метод ovlDemo() перегружается четырежды. В первой его версии па­раметры не предусмотрены, во второй — определен один целочисленный параметр, в третьей — два целочисленных параметра, в четвертой — два параметра типа double.

Обратите внимание на то, что первые два варианта метода ovlDemo() имеют тип void, а два другие возвращают значение. Тип возвращаемого значения не учитывается при перегрузке методов. Следовательно, попытка определить два варианта метода ovlDemo() так, как показано ниже, приводит к ошибке.

Как поясняется в комментариях к приведенному выше фрагменту кода, отличия воз­вращаемых типов недостаточно для перегрузки методов.

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

Выполнение этого фрагмента кода дает следующий результат:

В данном примере определены только два варианта метода f(): один принимает параметр типа int, а второй — параметр типа double.

Но передать методу f() можно также значение типа byte, short и float. Значения типа byte и short исполняющая система Java автоматически преобразует в тип int. В результате будет вызван вариант метода f(int). А если параметр имеет значение типа float, то оно преобразуется в тип doube, и далее вызывается вариант метода f(double).

Важно понимать, что автоматическое преобразование типов выполняется лишь в от­сутствие прямого соответствия типов параметра и аргумента. В качестве примера ниже представлена другая версия предыдущей программы, в которой добавлен вариант метода f() с параметром типа byte.

Выполнение этой версии программы дает следующий результат.

Поскольку в данной программе предусмотрена версия метода f(), которая принима­ет параметр типа byte, то при вызове этого метода с аргументом типа byte выполняется вызов f (byte), и автоматического преобразования типа byte в тип int не происходит.

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

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

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

Например,в языке С функция abs() возвращает абсолютное значение числа типа int, функция labs() — абсолютное значение числа типа long, а функция fabs() — абсолютное зна­чение числа с плавающей точкой.

Читать еще:  Error java lang runtimeexception

Объясняется это тем, что в С не поддерживается пе­регрузка, и поэтому каждая из функций должна обладать своим собственным именем,несмотря на то что все они выполняют одинаковые действия. Это приводит к нео­правданному усложнению процесса написания программ.

Разработчику приходится не только представлять себе действия, выполняемые функциями, но и помнить все три их имени. Такая ситуация не возникает в Java, потому что все методы, вычисляющие абсо­лютное значение, имеют одно и то же имя.

В стандартной библиотеке Java для вычисле­ния абсолютного значения предусмотрен метод abs(). Его перегрузка осуществляется в классе Math для обработки значений всех числовых типов.

Решение о том, какой имен­но вариант метода abs() должен быть вызван, исполняющая система Java принимает, исходя из типа аргумента.

Главная ценность перегрузки заключается в том, что она обеспечивает доступ к груп­пе родственных методов по общему имени. Следовательно, имя abs обозначает общее выполняемое действие, а компилятор сам выбирает конкретный вариант метода по об­стоятельствам.

Благодаря полиморфизму несколько имен сводятся к одному. Несмотря на всю простоту рассматриваемого здесь примера, продемонстрированный в нем прин­цип полиморфизма можно расширить, чтобы выяснить, каким образом перегрузка по­могает справляться с более сложными ситуациями в программировании.

Когда метод перегружается, каждая его версия может выполнять какое угодно дей­ствие. Для установления взаимосвязи перегружаемых методов не существует какого-то твердого правила, но с точки зрения правильного стиля программирования перегрузка методов подразумевает подобную взаимосвязь. Следовательно, использовать одно и тоже имя для несвязанных друг с другом методов не следует, хотя это и возможно.

Напри­мер, имя sqr можно было бы выбрать для методов, возвращающих квадрат и квадрат­ный корень числа с плавающей точкой. Но ведь это принципиально разные операции.

Такое применение перегрузки методов противоречит ее первоначальному назначению.На практике перегружать следует только тесно связанные операции.

Стоит отметить, что, программисты на Java часто употребляют термин сигнатура. Что это такое?

Применительно к языку Java сигнатура обозначает имя метода и список его пара­метров. При перегрузке методов действует следующее правило: никакие два ме­тода из одного класса не могут иметь одинаковые сигнатуры.

Следует, однако, иметь в виду, что сигнатура не включает в себя тип возвращаемого значения, поскольку он не используется в Java при принятии решения о перегрузке.

Интересное видео для читателей:

Где ваша точка?

Уловки и ловушки, связанные с плавающей точкой и десятичными числами

Серия контента:

Этот контент является частью # из серии # статей: Теория и практика Java

Этот контент является частью серии: Теория и практика Java

Следите за выходом новых статей этой серии.

Хотя практически каждый процессор и язык программирования и поддерживают арифметику с плавающей точкой, но большинство программистов почти не обращают на это внимания. И это понятно — мало кому из нас часто приходиться использовать дробные числовые типы. За исключением научных вычислений и редких случаев тестирования времени или оценки производительности, до этого просто не доходит дело. Десятичные числа с произвольной разрядностью, предоставляемые java.math.BigDecimal , также не используются большинством разработчиков, так как основная масса приложений не нуждается в их применении. Тем не менее, превратности представления дробных чисел все-таки иногда проникают и в программы, базирующиеся на целых числах. Например, JDBC использует BigDecimal как предпочтительный формат обмена для колонок DECIMAL SQL.

Плавающая точка IEEE

Язык Java поддерживает два простых типа с плавающей точкой: float и double , и их прототип — класс-оболочка Float и Double . Они основаны на стандарте IEEE 754, определяющем двоичный стандарт для двоично-десятичных чисел с 32-битовой плавающей точкой и 64-битовой плавающей точкой удвоенной точности.

IEEE 754 представляет числа с плавающей точкой как десятичные числа с основанием 2 в экспоненциальном формате. В IEEE числе с плавающей точкой выделяется 1 бит на знак, 8 бит на порядок и 23 бита на мантиссу, или дробную часть числа. Порядок расшифровывается как целое число со знаком, допускающее как положительный, так и отрицательный экспоненты. Дробь представляется как двоично-десятичное (основание 2) число, где самый старший бит соответствует значению ½ (2 -1 ), следующий бит ¼ (2 -2 ), и так далее. Для плавающей точки с удвоенной точностью на порядок выделяется 11 бит, а на мантиссу — 52 бит. Формат значений плавающей точки IEEE показан на рисунке 1.

Рисунок 1. Формат плавающей точки IEEE 754

Так как любое заданное число может быть представлено в экспоненциальном формате различными способами, то числа с плавающей точкой нормализуются таким образом, чтобы они могли быть представлены как десятичные числа с основанием 2, с 1 слева от десятичной точки, подбирая порядок таким образом, чтобы соблюсти данное требование. Следовательно, например, число 1.25 будет представлено с мантиссой 1.01 и порядком 0:
(-1)

Число 10.0 будет представлено с мантиссой 1.01 и порядком 3:
(-1)

Специальные числа

Помимо стандартного множества значений, разрешенного кодированием (от 1.4e-45 до 3.4028235e+38 для float ), существуют и специальные значения, представляющие бесконечность, минус бесконечность, -0 , и NaN (обозначает «не число»). Эти значения существуют для того, чтобы в случае возникновения ошибок, например, арифметического переполнения, извлечения квадратного корня из отрицательного числа и деления на 0 , можно было получить результат, представленный в диапазоне значений с плавающей точкой.

У таких специальных чисел есть несколько необычных характеристик. Например, 0 и -0 являются четко различимыми значениями, но при сравнении на тождественность они считаются равными. Деление ненулевого числа на бесконечность дает 0 . Специальное число NaN является неупорядоченным, а любое сравнение между NaN и другими значениями с плавающей точкой, с использованием операций == , и > выдаст неверно . Даже (f == f) выдаст ложь , если f является NaN. Если Вы хотите сравнить значение с плавающей точкой с NaN, то используйте метод Float.isNaN() . В таблице 1 показаны некоторые особенности бесконечности и NaN.

Таблица 1. Особенности специальных значений с плавающей точкой

Простой тип с плавающей точкой и класс-оболочка с плавающей точкой по-разному выполняют сравнение

Еще более усугубляет положение еще и то, что правила сравнения NaN и -0 у простого типа с плавающей точкой и класса-оболочки Float различаются. Для значений float , сравнение на тождественность двух значений NaN выдаст ложь , но при сравнении двух NaN объектов Float при использовании Float.equals() , будет выдано истина . Обоснованием этому может служить то, что иначе будет невозможно использовать NaN объект Float в качестве ключа в HashMap . Аналогично, хотя 0 и -0 и считаются равными, но в случае представления их в качестве значений с плавающей точкой, сравнение 0 и -0 как объектов Float при помощи Float.compareTo() указывает на то, что -0 является меньшей величиной, чем 0 .

Непредвиденные обстоятельства использования плавающей точки

В связи с особым поведением бесконечности, NaN и 0 определенные трансформации и оптимизации могут показаться безвредными, но при применении к числам с плавающей точкой будут приводить к ошибкам. Например, несмотря на то, что равенство 0.0-f и -f кажется очевидным, но оно ложно, если f равно 0 . Существуют и другие подобные проблемы, некоторые из которых показаны в таблице 2.

Читать еще:  Java system getproperty

Таблица 2. Ошибочные представления о числах с плавающей точкой

Ошибки округления

Арифметика чисел с плавающей точкой не отличается особой точностью. Тогда как некоторые числа, например, 0.5 , можно точно представить как двоично-десятичные (основание 2) (поскольку 0.5 равно 2 -1 ), но другие числа, например, 0.1 — невозможно. В итоге операции над числами с плавающей точкой могут привести к ошибкам округления, выдавая результат, близкий — но не равный — тому результату, который можно было ожидать. Например, простое вычисление, приведенное ниже, равняется 2.600000000000001 , а не 2.6 :

Аналогично, умножение .1*26 выдает результат, отличный от прибавления .1 к самому себе 26 раз. Ошибки округления могут оказаться даже более серьезными при преобразовании типа от вещественного к целому, поскольку при преобразовании к целому типу нецелая часть отбрасывается, даже для вычислений, которые «выглядят похожими», они должны иметь целые значения. Например, следующие выражения:

на выходе дадут:

что не совсем соответствует первоначально ожидаемому результату.

Рекомендации по сравнению чисел с плавающей точкой

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

Лучше всего вообще стараться избегать сравнений чисел с плавающей точкой. Конечно же, это не всегда возможно, но Вы должны понимать ограничения сравнения чисел с плавающей точкой. Если Вам нужно сравнить числа с плавающей точкой для того, чтобы узнать, тождественны ли они, то вместо этого следует сравнивать абсолютное значение их разности с каким-либо предварительно выбранным значением эпсилон. То есть, таким образом, Вы проверяете насколько они «близки». (Если Вам не известен коэффициент масштабирования основных измерений, то использование проверки «abs(a/b — 1) BigDecimal . BigDecimal является стандартным классом, без специальной поддержки в компиляторе, для представления двоичных чисел произвольной разрядности и выполнения арифметических действий над ними. По сути дела BigDecimal представлен как недифференцированное значение произвольной разрядности и коэффициент масштабирования, который указывает насколько сдвинуть влево десятичную точку для получения значения, разбитого на дробную и целую части. Итак, число, представленное BigDecimal является unscaledValue*10 -scale .

Арифметические действия над значениями BigDecimal реализуются с помощью методов для сложения, вычитания, умножения и деления. Поскольку объекты BigDecimal являются неизменяемыми, то каждый из этих методов производит новый объект BigDecimal . В итоге BigDecimal не слишком хорошо подходит для интенсивных вычислений из-за затрат на создание объекта, но он спроектирован для представления точных десятичных чисел. Если Вам необходимо представить такие точные величины как денежные суммы, то BigDecimal прекрасно подойдет для этой задачи.

Все методы сравнения не созданы равными

Как и у всех типов с плавающей точкой, у BigDecimal тоже есть несколько особенностей. А именно, будьте осторожны с использованием метода equals() для проверки тождественности чисел. Два значения BigDecimal , представляющих одно и то же число, но имеющих различные коэффициенты масштабирования (например, 100.00 и 100.000 ) не будут равными при использовании метода equals() . Тем не менее, метод compareTo() будет считать их равными, а, следовательно, Вы должны использовать compareTo() вместо equals() при количественном сравнении двух значений BigDecimal .

Существуют некоторые случаи, когда для получения точных результатов недостаточно двоичной арифметики с произвольной разрядностью. Например, деление 1 на 9 выдает бесконечную периодическую двоичную дробь .111111. По этой причине BigDecimal позволяет Вам явно контролировать округление при выполнении операций деления. Точное деление на показатель степени 10 поддерживается методом movePointLeft() .

Используйте BigDecimal в качестве типа обмена

В SQL-92 есть тип данных DECIMAL , который является точным числовым типом для представления десятичных чисел с фиксированной точкой и выполняет основную арифметическую операцию над двоичными числами. В некоторых диалектах SQL предпочитают называть этот тип NUMERIC , а другие также содержат тип данных MONEY , который определяется как десятичное число с двумя знаками справа от десятичной дроби.

Если Вы хотите сохранить число в поле DECIMAL в базе данных или извлечь значение из поля DECIMAL , то как можно убедиться в том, что число будет передано точно? Вы не хотите использовать методы setFloat() и getFloat() , обеспечиваемые JDBC классами PreparedStatement и ResultSet , поскольку конвертация из числа с плавающей точкой в десятичное число может привести к потере точности. Вместо этого, используйте setBigDecimal() и getBigDecimal() методы PreparedStatement и ResultSet .

Аналогично, XML-инструменты привязки данных, например, Castor, сгенерируют механизмы получения и установки для десятичных атрибутов и элементов (которые поддерживаются в качестве основного типа данных в XSD-схеме), используя BigDecimal .

Построение чисел BigDecimal

Существует несколько конструкторов для BigDecimal . Один в качестве входной информации использует плавающую точку удвоенной точности, второй — целое число и коэффициент масштабирования, а третий — String — представление десятичного числа. Вам нужно быть осторожными с конструктором BigDecimal(double) , поскольку он может позволить ошибкам округления появиться в Ваших вычислениях раньше, чем вы об этом узнаете. Вместо этого используйте целое число или конструкторы, основанные на String .

Ненадлежащее использование конструктора BigDecimal(double) может проявляться в кажущихся странными ошибках в JDBC-драйверах при передаче в JDBC setBigDecimal() метод. Например, рассмотрим следующий JDBC-код, который хочет сохранить число 0.01 в десятичном поле:

В зависимости от Вашего драйвера JDBC, этот кажущийся безобидным код может при выполнении выдать некоторые запутанные ошибки, потому что приближенная величина с удвоенной точностью 0.01 приведет к большому дифференцированному значению, которое может запутать JDBC-драйвер и базу данных. Ошибка появится в JDBC драйвере, но весьма маловероятно, что она проявит себя, и Вы не будете знать, что не так с Вашим кодом, до тех пор, пока Вы не поймете ограничения двоичных чисел с плавающей точкой. Чтобы избежать возникновения таких проблем, сконструируйте BigDecimal , используя BigDecimal(«0.01») или BigDecimal(1, 2) , так как каждый из них, в конечном счете, приведет к точному десятичному представлению.

Заключение

Использование чисел с плавающей точкой и десятичных чисел в программах Java чревато трудностями. Числа с плавающей точкой и десятичные числа ведут себя совсем не так хорошо как целые, и Вы не можете предположить, что в действительности делают вычисления с плавающей точкой, у которых «должны» быть целочисленные или точные результаты. Лучше всего приберечь использование арифметики с плавающей точкой для вычислений, которые требуют принципиально неточных значений, например измерений. Если Вам необходимо представить величины с фиксированной точкой, например, доллары и центы, то используйте BigDecimal .

Ссылка на основную публикацию
ВсеИнструменты 220 Вольт
Adblock
detector
×
×