23、大数字运算(BigInteger、BigDecimal)和数据格式化(NumberFormat、DecimalFormat)

一 大数字运算

在Java中提供了大数字的操作类,即BigInteger与BigDecimal,这两个类用于高精度计算,其中BigInteger是针对大整数的处理类,而BigDecimal则是针对大小数的处理类

1.1 BigInteger

BigInteger类型的数字范围较Integer类型的数字范围要大的多。BigInteger支持任意精度的整数,也就是说在运算中BigInteger类型可以准确的表示任何大小的整数值而不会丢失任何信息

 

在BigInteger类中封装了多种操作,除了基本的加、减、乘、除之外,还提供了绝对值、相反数、最大公约数以及判断是否为质数等操作

 

使用BigInteger类,可以实例化一个BigInteger对象,并自动调用相应的构造函数,BigInteger类有多种构造函数,如下将字符串转成BigInteger

public BigInteger(String val)

 

例如,将字符串2转换成BigInteger类型

BigInteger towInstance = new BigInteger("2");

 

一旦创建了对象实例,就可以调用BigInteger类中的一些方法进行运算操作,包括基本的数学运算和位运算以及一些取相反数、绝对值等操作。

 

1.1.1 BigInteger常用方法

如下,列举了BigInteger类中常用的几种运算方法

  • BigInteger add(BigInteger val):加法操作

  • BigInteger subtract(BigInteger val):减法操作

  • BigInteger multiply(BigInteger val):乘法操作

  • BigInteger devide(BigInteger val):除法操作

  • BigInteger remainder(BigInteger val):取余操作

  • BigInteger[] devideAndRemainder(BigInteger val):用数组返回余数和商,结果数组中第一个值为商,第二个值为余数

  • BigInteger pow(int exponent):进行参数exponent次方操作

  • BigInteger negate():取相反数

  • BigInteger shiftLeft(int n):将数字左移n位,如果n为负数,做右移操作

  • BigInteger shiftRight(int n):将数字右移n位,如果n为负数,做左移操作

  • BigInteger and(BigInteger val):做与操作

  • BigInteger or(BigInteger val):做或操作

  • int compareTo(BigInteger val):做数字比较操作

  • boolean equals(Object x):当参数x是BigInteger类型的数字并且数值相等时,返回true

  • BigInteger min(BigInteger val):返回最小的数值

  • BigInteger max(BigInteger val):返回最大的数值

 

如下面一段代码

package com.bianjf.testbignumber;

import java.math.BigInteger;

public class BigIntegerDemo {
    public static void main(String[] args) {
         BigInteger bigInstance = new BigInteger("4");//实例化一个大数
         //该大数+2操作
         System.out.println("加法操作:" + bigInstance.add(new BigInteger("2")));
         //该大数-2操作
         System.out.println("减法操作:" + bigInstance.subtract(new BigInteger("2")));
         //该大数x2操作
         System.out.println("乘法操作:" + bigInstance.multiply(new BigInteger("2")));
         //该大数/2操作
         System.out.println("除法操作:" + bigInstance.divide(new BigInteger("2")));
         //该大数/3的商
         System.out.println("取商:" + bigInstance.divideAndRemainder(new BigInteger("3"))[0]);
         //该大数/3的余数
         System.out.println("取余数:" + bigInstance.divideAndRemainder(new BigInteger("3"))[1]);
         //该大数的相反数
         System.out.println("取相反数操作:" + bigInstance.negate());
    }
}

 

1.2 BigDecimal

BigDecimal和BigInteger都能实现大数字的运算,不同的是BigDecimal加入了小数的概念。一般float和double类型数据只可以用来做科学计算或工程计算,但由于在商业计算中要求数字精度比较高,所以要用到BigDecimal类。

 

BigDecimal类支持任何精度的定点数,可以用它来计算货币值

 

在BigDecimal中常用的构造方法如下

public BigDecimal(double val)//实例化时将双精度型转换为BigDecimal

public BigDecimal(String val)//实例化时将字符串形式转换为BigDecimal类型

 

1.2.1 常用方法

BigDecimal类型的数字可以用来做超大的浮点数的运算,如加、减、乘、除等,但是在所有的运算中除法是最复杂的,因为在除不尽时末位小数点的处理是需要考虑的,如下运算方法

  • BigDecimal add(BigDecimal augend):做加法操作

  • BigDecimal subtract(BigDecimal subtrahend):做减法操作

  • BigDecimal multiply(BigDecimal multiplicand):做乘法操作

  • BigDecimal divide(BigDecimal divisor, int scale, int roundingMode):做除法操作,方法3个参数分别代表除数、商的小数点后的位数、近似处理模式

 

在上述的方法中,BigDecimal中的divide()方法有多种设置,用于返回商末位小数点的处理,如下模式

 

模式

含义

BigDecimal.ROUND_UP

商的最后一位数如果大于0,则向前进位,正负数都如此

BigDecimal.ROUND_DOWN

商的最后一个无论是什么数字都省略

BigDecimal.ROUND_CEILING

商如果是正数,按照ROUND_UP模式处理;如果是负数,则按照ROUND_DOWN模式处理。这种模式的处理都会使近似值大于实际值

BigDecimal.ROUND_FLOOR

与ROUND_CEILING模式相反,商如果是正数,按照ROUND_DOWN处理;商如果是负数,按照ROUND_UP模式处理。这种模式的处理都会使近似值小于实际值

BigDecimal.ROUND_HALF_DOWN

对商进行四舍五入操作,如果商最后一位小于5,则做舍弃操作;如果最后一位大于5,则做进位操作,如7.5≈7

BigDecimal.ROUND_HALF_UP

对商进行四舍五入操作,如果商的最后一位小于5则舍弃;如果大于等于5,则进位操作,如7.5≈8

BigDecimal.ROUND_EVEN

如果商的倒数第二位为奇数,则按照ROUND_HALF_UP处理;如果为偶数,则按照ROUND_HALF_DOWN处理,如7.5≈8;8.5≈8

 

 

如下面一段代码

package com.bianjf.testbignumber;

import java.math.BigDecimal;

public class BigDecimalDemo {
    /**
     * 定义加法运算
     * @param value1 加数
     * @param value2 被加数
     * @return 两数之和
     */
    public BigDecimal add(double value1, double value2) {
         BigDecimal b1 = new BigDecimal(Double.toString(value1));
         BigDecimal b2 = new BigDecimal(Double.toString(value2));
         return b1.add(b2);//加法运算
    }

    /**
     * 定义减法方法
     * @param value1 被减数
     * @param value2 减数
     * @return
     */
    public BigDecimal sub(double value1, double value2) {
         BigDecimal b1 = new BigDecimal(Double.toString(value1));
         BigDecimal b2 = new BigDecimal(Double.toString(value2));
         return b1.subtract(b2);//减法运算
    }

    /**
     * 定义乘法方法
     * @param value1 第一个乘数
     * @param value2 第二个乘数
     * @return
     */
    public BigDecimal mul(double value1, double value2) {
         BigDecimal b1 = new BigDecimal(Double.toString(value1));
         BigDecimal b2 = new BigDecimal(Double.toString(value2));
         return b1.multiply(b2);//乘法运算
    }


    /**
     * 定义除法方法
     * @param value1 被除数
     * @param value2 除数
     * @param b 商小数点后保留的位数
     * @return 结果值
     */
    public BigDecimal div(double value1, double value2, int b) {
         if (b < 0) {
             System.out.println("b值必须大于等于0");
             return null;
         }
         BigDecimal b1 = new BigDecimal(Double.toString(value1));
         BigDecimal b2 = new BigDecimal(Double.toString(value2));
         return b1.divide(b2, b, BigDecimal.ROUND_HALF_UP);//四舍五入
    }


    public static void main(String[] args) {
         BigDecimalDemo b = new BigDecimalDemo();
         System.out.println("两个数字相加结果:" + b.add(-7.5, 8.9));
         System.out.println("两个数相减结果:" + b.sub(-7.5, 8.9));
         System.out.println("两个数相乘结果:" + b.mul(-7.5, 8.9));
         System.out.println("两个数相除,保留小数后5位:" + b.div(-7.5, 8.9, 5));
    }
}

 

二 数据格式化

2.1 NumberFormat

在NumberFormat类中为我们提供了格式化4种数字的方法:整数、小数、货币和百分比,通过工厂方法getIntegerInstance,getNumberInstance,getCurrencyInstance,getPercentInstance方法获得相应的实例对象。NumberFormat是所有数值格式的抽象基类,此类提供格式化和解析数值的接口。

 

2.1.1 常用方法

如下API

23、大数字运算(BigInteger、BigDecimal)和数据格式化(NumberFormat、DecimalFormat)_第1张图片

23、大数字运算(BigInteger、BigDecimal)和数据格式化(NumberFormat、DecimalFormat)_第2张图片

23、大数字运算(BigInteger、BigDecimal)和数据格式化(NumberFormat、DecimalFormat)_第3张图片

 

2.1.2 案例

2.1.2.1 格式化人民币

通过getPercentInstance(Locale locale)方法,以参数Locale对象所指定的环境来获得处理货币的NumberFormat实例对象

package com.bianjf.test01;
import java.text.NumberFormat;
import java.util.Locale;

public class NumberFormatTest {
    public static void main(String[] args) {
         int price = 18;//价格变量
         NumberFormat nf = NumberFormat.getCurrencyInstance(Locale.CHINA);//以中国的人民币方式格式化
         String priceFormat = nf.format(price);
         System.out.println("输出:" + priceFormat);
    }
}

以中国的货币格式显示:输出:¥18.00

 

同理,格式化美元如下

package com.bianjf.test01;

import java.text.NumberFormat;
import java.util.Locale;

public class NumberFormatTest {
    public static void main(String[] args) {
         int price = 18;//价格变量
         NumberFormat nf = NumberFormat.getCurrencyInstance(Locale.US);//以美国的货币方式格式化
         String priceFormat = nf.format(price);
         System.out.println("输出:" + priceFormat);
    }
}

 

以美元的的格式显示:输出:$18.00

 

2.1.2.2 百分比格式

将基本类型数字转换成百分比格式的字符串,如下

package com.bianjf.test01;

import java.text.NumberFormat;

public class NumberFormatPercentTest {
    public static void main(String[] args) {
         double percent = 0.5;
         NumberFormat nf = NumberFormat.getPercentInstance();//以百分比形式格式化
         String percentFormat = nf.format(percent);
         System.out.println("输出:" + percentFormat);
    }
}

输出:50%

 

2.2 DecimalFormat

DecimalFormat是NumberFormat类的子类,主要的作用是用来格式化数字使用,比直接使用NumberFormat更加方便。使用DecimalFormat必须提供一个格式化的模式(pattern)

 

格式化模板如下

 

符号

位置

本地化

含义

0

数字

阿拉伯数字

#

数字

阿拉伯数字,如果不存在则显示为0

.

数字

小数分隔符或货币小数分隔符

-

数字

减号

,

数字

分组分隔符

E

数字

分隔科学计数法中的尾数和指数。在前缀或后缀中无需加引号

;

子模式边界

分隔正数和负数子模式

%

前缀或后缀

乘以100并显示为百分数

\u2030

前缀或后缀

乘以1000并显示为千分数

 

 

2.2.1 案例

package com.bianjf.test01;
import java.text.DecimalFormat;

public class DecimalFormatTest {
    public static void main(String[] args) {
         format("###,###.###",111222.34567);//保留三位小数
         format("##.###%",0.345678);//百分比方式,保留三位小数
         format("###.###\u2030",0.345678);//千分比方式,保留三位小数
    }

    /**
     * 格式化
     * @param pattern 格式
     * @param value 值
     */
    public static void format(String pattern, double value) {
         DecimalFormat df = new DecimalFormat(pattern);//实例化对象,传入模板
         String valueFormat = df.format(value);//格式化数字
         System.out.println("使用" + pattern + "模式格式化数字" + value + ": " + valueFormat);
    }
}

 

显示如下

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(Java基础)