Подробный анализ класса BigDecimal подробного объяснения API Java.

7. Класс BigDecimal

7.1 Введение

Сначала проанализируем результаты выполнения следующей программы:

public class BigDecimalDemo01 {

    public static void main(String[] args) {
        System.out.println(0.09 + 0.01);
    }

}

Этот код относительно прост, он заключается в вычислении суммы 0,09 и 0,01 и выводе результата на консоль. Тогда по нашей задумке результат на консоли должен быть 0,1. Так каков же фактический результат бега? Запустим программу, консольный вывод

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

0.09999999999999999

Этот результат на самом деле является результатом потери точности. Почему теряется точность?

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

При выполнении вычислений компьютер преобразует десятичные данные в двоичные данные, а затем выполняет вычисления. После завершения расчета компьютер преобразует результаты вычислений в десятичные данные и показывает нам; если мы используем данные целочисленного типа для расчета, Это

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

Двоичные данные, близкие к этому десятичному числу; таким образом, при использовании неточных данных для вычислений точность в конечном итоге будет потеряна; для повышения точности Java предоставляет нам BigDecimal для выполнения вычислений данных.

7.2 Обзор

Глядя на документацию API, мы видим, что определение класса BigDecimal в документации API выглядит следующим образом:

Пакет, в котором находится BigDecimal, находится в пакете java.math, поэтому при его использовании его необходимо импортировать. Мы можем использовать класс BigDecimal для более точных вычислений данных.

7.3 Общие методы

Метод строительства

Чтобы использовать класс BigDecimal, вам необходимо сначала научиться создавать объекты BigDecimal. Просматривая документацию API, мы можем обнаружить, что Jdk предоставляет множество методов построения для класса BigDecimal, но наиболее часто используемые методы построения:

После понимания общих методов построения давайте сосредоточимся на общих методах-членах.

общие методы-члены

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

public BigDecimal add(BigDecimal value)				// 加法运算
public BigDecimal subtract(BigDecimal value)		// 减法运算
public BigDecimal multiply(BigDecimal value)		// 乘法运算
public BigDecimal divide(BigDecimal value)			// 触发运算

Далее давайте продемонстрируем использование этих методов-членов в некоторых случаях.

Случай 1. Демонстрация четырех основных операций.

Код выглядит следующим образом:

public class BigDecimalDemo01 {

    public static void main(String[] args) {

        // 创建两个BigDecimal对象
        BigDecimal b1 = new BigDecimal("0.3") ;
        BigDecimal b2 = new BigDecimal("4") ;

        // 调用方法进行b1和b2的四则运算,并将其运算结果在控制台进行输出
        System.out.println(b1.add(b2));         // 进行加法运算
        System.out.println(b1.subtract(b2));    // 进行减法运算
        System.out.println(b1.multiply(b2));    // 进行乘法运算
        System.out.println(b1.divide(b2));      // 进行除法运算

    }

}

Запустите программу для проверки, вывод на консоль будет следующим:

4.3
-3.7
1.2
0.075

На этом этапе мы видим, что использование класса BigDecimal для завершения вычисления чисел с плавающей запятой не приведет к потере точности.

Случай 2 : Демонстрация особого случая деления.

Если результатом операции деления с использованием данных типа BigDecimal является бесконечно повторяющаяся десятичная дробь, будет сообщено об ошибке: ArithmeticException. Как показано в следующем коде:

public class BigDecimalDemo02 {

    public static void main(String[] args) {

        // 创建两个BigDecimal对象
        BigDecimal b1 = new BigDecimal("1") ;
        BigDecimal b2 = new BigDecimal("3") ;

        // 调用方法进行b1和b2的除法运算,并且将计算结果在控制台进行输出
        System.out.println(b1.divide(b2));

    }

}

Запустите программу для проверки, вывод на консоль будет следующим:

Exception in thread "main" java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.
	at java.base/java.math.BigDecimal.divide(BigDecimal.java:1716)
	at com.itheima.api.bigdecimal.demo02.BigDecimalDemo02.main(BigDecimalDemo02.java:14)

Чтобы решить эту проблему, нам нужно использовать другой метод деления в классе BigDecimal, как показано ниже:

BigDecimal divide(BigDecimal divisor, int scale, int roundingMode)

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

divisor:			除数对应的BigDecimal对象;
scale:				精确的位数;
roundingMode:		取舍模式;
取舍模式被封装到了RoundingMode这个枚举类中(关于枚举我们后期再做重点讲解),在这个枚举类中定义了很多种取舍方式。最常见的取舍方式有如下几个:
UP(直接进1) , FLOOR(直接删除) , HALF_UP(4舍五入),我们可以通过如下格式直接访问这些取舍模式:枚举类名.变量名

Далее давайте продемонстрируем эти компромиссные режимы. Код выглядит следующим образом:

public class BigDecimalDemo02 {

    public static void main(String[] args) {

        // 调用方法
        method_03() ;

    }

    // 演示取舍模式HALF_UP
    public static void method_03() {

        // 创建两个BigDecimal对象
        BigDecimal b1 = new BigDecimal("0.3") ;
        BigDecimal b2 = new BigDecimal("4") ;

        // 调用方法进行b1和b2的除法运算,并且将计算结果在控制台进行输出
        System.out.println(b1.divide(b2 , 2 , RoundingMode.HALF_UP));

    }

    // 演示取舍模式FLOOR
    public static void method_02() {

        // 创建两个BigDecimal对象
        BigDecimal b1 = new BigDecimal("1") ;
        BigDecimal b2 = new BigDecimal("3") ;

        // 调用方法进行b1和b2的除法运算,并且将计算结果在控制台进行输出
        System.out.println(b1.divide(b2 , 2 , RoundingMode.FLOOR));

    }

    // 演示取舍模式UP
    public static void method_01() {

        // 创建两个BigDecimal对象
        BigDecimal b1 = new BigDecimal("1") ;
        BigDecimal b2 = new BigDecimal("3") ;

        // 调用方法进行b1和b2的除法运算,并且将计算结果在控制台进行输出
        System.out.println(b1.divide(b2 , 2 , RoundingMode.UP));

    }

}

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

7.4 Основной метод хранения:

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

Supongo que te gusta

Origin blog.csdn.net/qq_69748833/article/details/132612563
Recomendado
Clasificación