初识Java(Java数字处理类-大数字运算)

时间:2022-12-21 22:53:26

一、大数字运算

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

BigInteger

  BigInteger  类型的数字范围较 Integer 类型的数字范围要大得多。 Integer 是 int 的包装类, int 的最大值是 2³¹-1 ,如果要计算更大的数字,使用 Integer 数据类型就无法实现了,所以 Java 中提供了 BigInteger 类来处理更大的数字。

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

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

  使用 BigInteger 类,可以实例化一个 BigInteger 对象,并自动调用相应的构造函数。 BigInteger 类具有很多构造函数,但最直接的一种方式是参数以字符串形式代表要处理的数字。

  语法如下 :

public BigInteger(String val)

其中 , val  是十进制字符串。

如果将 2 转换为 BigInteger 类型,可以使用一下语句进行初始化操作 :

BigInteger twoInstance = new BigInteger("2");     //将十进制 2 转换为 BigInteger 形式

参数 2 的双引号不能省略,因为参数是以字符串的形式存在的。

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

( 1 ) public BigInteger add(BigInteger val)  :                     做加法运算
( 2 ) public BigInteger subtract(BigInteger val) : 做减法运算
( 3 ) public BigInteger multiply(BigInteger val) : 做乘法运算
( 4 ) public BigInteger divide(BigInteger val) : 做除法运算
( 5 ) public BigInteger remainder(BigInteger val) : 做取余运算
( 6 ) public BigInteger[] divideAndRemainder (BigInteger val) : 用数组返回余数和商,结果数组中第一个值为商,第二个值为余数
( 7 ) public BigInteger pow(int exponent) : 进行取参数的 exponent 次方操作
( 8 ) public BigInteger negate() : 取相反数
( 9 ) public BigInteger shiftLeft(int n) : 将数字左移 n 位,如果 n 为负数,做右移操作
( 10 )public BigInteger shiftRight(int n) : 将数字右移 n 位,如果 n 为负数,做左移操作
( 11 )public BigInteger and(BigInteger val) : 做与操作
( 12 )public BigInteger or(BigInteger val) : 做或操作
( 13 )public int compareTo(BigInteger val) : 做数字比较操作
( 14 )public boolean equals(Object x) : 当参数 x 是 BigInteger 类型的数字并且数值相等时,返回 true
( 15 )public BigInteger min(BigInteger val) : 返回较小的数值
( 16 )public BigInteger max(BigInteger val) : 返回较大的数值

    eg : 创建类,在类的主方法中创建 BigInteger 类的实例对象,调用该对象的各种方法实现大整数的加、减、乘、除和其他运算,并输出运算结果。

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

运行结果为 :

加法操作:6
减法操作:2
乘法操作:8
除法操作:2
取商操作:1
取余数操作:1
做 2 次方操作:16
取相反数操作:-4

BigDecimal

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

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

  在 BigDecimal 类中常用的两个构造方法如下 :

    public BigDecimal(double val) :    实例化时将双精度型转换为 BigDecimal 类型
    public BigDecimal(String val) : 实例化时将字符串形式转换为 BigDecimal 类型

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

  下面列举 BigDecimal 类中实现加、减、乘、除的方法 :

    public BigDecimal add(BigDecimal augend) :做加法操作
    public BigDecimal subtract(BigDecimal subtrahend) :做减法操作
    public BigDecimal multiply(BigDecimal multiplicand) :做乘法操作
    public BigDecimal divide(BigDecimal divisor , int sacle ,int roundingMode) :做除法操作,方法中 3 个参数分别代表除数、商的小数点后的位数、近似处理模式

  在上述方法中,BigDecimal 类中 divide() 方法有多种设置,用于返回商末位小数点的处理,这些模式的名称与含义如下 :

  BigDecimal 类中 divide() 方法的多种处理模式
  模式    含义
    BigDecimal.ROUND_UP    s商的最后一位如果大于 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_HALF_EVEN

  如果商的倒数第二位为奇数,则按照 ROUND_HALF_UP 处理;

  如果为偶数,则按照 ROUND_HALF_DOWN 处理,如 7.5 ≈ 8 , 8.5 ≈ 8

     eg  : 创建类,在类中分别定义 add() 、sub() 、mul() 和 div() 方法实现加、减、乘、除运算,并输出运算结果。

import java.math.BigDecimal;
public class BigDecimalDemo {
static final int location = 10;
/**
* 定义加法方法,参数为加数与被加数
* @param value1 相加的第一个数
* @param value2 相加的第二个数
* @return 两数之和
*/
public BigDecimal add(double value1 , double value2) {
//实例化 Decimal 对象
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) {
//实例化 Decimal 对象
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) {
//实例化 Decimal 对象
BigDecimal b1 = new BigDecimal(Double.toString(value1));
BigDecimal b2 = new BigDecimal(Double.toString(value2));
return b1.multiply(b2); //调用乘法方法
}
/**
* 定义除法方法,参数为除数与被除数
* @param value1 被除数
* @param value2 除数
* @return 运算结果
*/
public BigDecimal div(double value1 , double value2) {
return div(value1, value2,location);//调用自定义除法方法
}
public BigDecimal div(double value1 , double value2 ,int b) {
if (b<0) {
System.out.println("b 值必须大于等于 0");
}
BigDecimal b1 = new BigDecimal(Double.toString(value1));
BigDecimal b2 = new BigDecimal(Double.toString(value2));
//调用除法方法,商小数点保留 b 位,并将结果进行四舍五入操作
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("两个数字相除结果,结果小数后保留 10 位:" + b.div(10,2));
System.out.println("两个数字相除,保留小数后 5 位:" + b.div(-7.8,8.9,5));
}
}

运行结果为:

两个数字相加结果:1.4
两个数字相减结果:-16.4
两个数字相乘结果:-66.75
两个数字相除结果,结果小数后保留 10 位:5.0000000000
两个数字相除,保留小数后 5 位:-0.87640

原文:https://blog.csdn.net/js940814/article/details/80210456

初识Java(Java数字处理类-大数字运算)的更多相关文章

  1. Java开发知识之Java的数字处理类Math类

    Java开发知识之Java的数字处理类Math类 一丶Java.text.DecimalFormat类与NumberFormat类 首先 Java.text.DecimalFormat指的是Decim ...

  2. 大数字运算&comma; BigInteger

    package com.ykmimi.test1; import java.math.BigInteger; /** * 大数字运算 * @author ukyor * */ public class ...

  3. 大数字运算——2、BigDecimal

    package com.wh.BigInteger; import java.math.BigDecimal; import java.util.Arrays; /** * @author 王恒 * ...

  4. Java—包装类&sol;System类&sol;Math类&sol;Arrays类&sol;大数据运算&sol;Collection接口&sol;Iterator迭代器

    基本类型包装类 8种基本类型对应的包装类如: 将字符串转成基本类型: 将基本数值转成字符串有3种方式: 基本类型直接与””相连接即可:34+" " 调用String的valueOf ...

  5. Java之数字处理类浅析

    包装类: 数据类型相对的包装类:byte---Byteshort---Shortint---Integerlong---Long float---Floatdouble---Double boolea ...

  6. JAVA之Math类常用数学运算记录

    Math中定义了许多的方法,且这些方法均为static类型,通过Math类就能直接调用. 调用形式:Math.方法名 例如,我要进行e运算,那么我直接调用Math.exp(double 类型 数值); ...

  7. Java Math数字处理类与包装类习题

    //创建Integer类对象,并以int型返回 Integer intAb = new Integer("123"); System.out.println(intAb.intVa ...

  8. 大数字运算——1、BigInteger

    package com.wh.BigInteger; import java.math.BigInteger; import java.util.Arrays; /** * @author 王恒 * ...

  9. &lbrack;java初探10&rsqb;&lowbar;&lowbar;关于数字处理类

    前言 在我们的日常开发过程中,我们会经常性的使用到数字类型的数据,同时,也会有众多的对数字处理的需求,针对这个方面的问题,在JAVA语言中.提供解决方法的类就是数字处理类 java中的数字处理类包括: ...

随机推荐

  1. Scalaz(4)- typeclass:标准类型-Equal&comma;Order&comma;Show&comma;Enum

    Scalaz是由一堆的typeclass组成.每一个typeclass具备自己特殊的功能.用户可以通过随意多态(ad-hoc polymorphism)把这些功能施用在自己定义的类型上.scala这个 ...

  2. ABAP程序中关于长文本的处理方法

    现象描述 长文本在SAP的运用主要体现在一些notes的记录,或者一些比较长的文本的存取,比如工作流的审批意见,采购申请和采购订单的附加说明等等.如下图: 处理过程 1:SAP中所有的长文本都存在两张 ...

  3. &lbrack;codevs4247&rsqb;奇特的生物

    题目描述 Description 科学家们最近发现了一种奇怪的生物,它们每天长大一岁,刚出生的宝宝为1岁,且它们的年龄没有上限.已知年龄为1岁,2岁,3岁,……,k岁的个体具有生育能力,当年龄为i的具 ...

  4. hdu1263 水果(结构体排序)

    Problem Description 夏天来了~~好开心啊,呵呵,好多好多水果~~ Joe经营着一个不大的水果店.他认为生存之道就是经营最受顾客欢迎的水果.现在他想要一份水果销售情况的明细表,这样J ...

  5. Android sdk content loader

    方法一(关闭后重启): 遇到Eclipse右下角一直显示“Android sdk content loader 0%”的情况时,直接关掉Eclipse,有ADB进程在运行时通过进程管理器结束进程,然后 ...

  6. 豌豆夹Redis解决方式Codis源代码剖析:Proxy代理

    豌豆夹Redis解决方式Codis源代码剖析:Proxy代理 1.预备知识 1.1 Codis Codis就不详细说了,摘抄一下GitHub上的一些项目描写叙述: Codis is a proxy b ...

  7. jquery append 动态添加的元素绑定事件on

    用jquery添加新元素很容易,面对jquery append 动态添加的元素事件on 不起作用我们该如何解决呢?on方法中要先找到原选择器(如例.info),再找到动态添加的选择器(如列.delet ...

  8. 初步探究Android App API接口测试--实战

    一.Android App API接口测试 1.如何学好Android App API接口测试 postman可以用来实现API接口自动化测试,但是也有弊端,无法实现接口测试数据的参数化,为了达到接口 ...

  9. Java Web 禁用Cookie对Session的影响

    如果客户端禁用了Cookie,那么服务端就不能得到Session了.因为通过Session ID来确定当前会话对应的服务端Session,而Session ID通过Cookie来传递,所以禁用Cook ...

  10. 教你玩转XSS漏洞

    什么是存储性XSS那? 通俗理解就是”xss“语句存在服务器上,可以一直被客户端浏览使用,所有登陆某一个存在”存储性xss“的页面的人,都会中招,可以是管理员,可以是普通的用户,所以他的危害是持续性的 ...