java 大数基本操作

Wesley13
• 阅读 504

导言:

  计算机中数字的表示范围是有一定的限制的,像Java中,常用的数据类型,如int、double等数据类型表示的范围都是有限的,当我们要计算的数字,其位数达到成百上千时,这些数据类型无法满足我们的需求,C语言中我们可以使用数组来储存位数,再对两个数组进行相应的运算;Java中为了处理大整数的运算,提供了一种数据类型:BigInteger,BigDecimal,它能存储任意位数的大数,并提供对它们进行操作的方法。

说明:

  BigInteger 和 BigDecimal 是位于java.math 包下的两个类,具体摘要如下:

BigDecimal 

不可变的、任意精度的有符号十进制数。任意精度小数

BigInteger

不可变的任意精度的整数。任意精度整数

BigInteger基本运算:

import java.math.BigInteger;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        BigInteger one = scanner.nextBigInteger();
        BigInteger two = scanner.nextBigInteger();
        System.out.println("大数相加:" + one.add(two));
        System.out.println("大数相减:" + one.subtract(two));
        System.out.println("大数相乘:" + one.multiply(two));
        System.out.println("大数相除:" + one.divide(two));
        scanner.close();
    }
}

BigInteger的基本操作

方法 

类型

描述

public BigInteger add(BigInteger val)

普通

将两个大数相加

public BigInteger subtract(BigInteger val)

普通

将两个大数相减

public BigInteger multiply(BigInteger val)

普通

将两个大数相乘

public BigInteger divide(BigInteger val)

普通

将两个大数相除

public BigInteger max(BigInteger val)

普通

返回两个大数中的最大值

public BigInteger min(BigInteger val)

普通

返回两个大数中的最小值

public BigInteger[] divideAndRemainder(BigInteger val)

普通

除发操作,数组的第一个元素为除法的商,第二个元素为除法的余数

public int compareTo(BigInteger val)

普通

 当此 BigInteger 在数值上小于、等于或大于 val 时,返回 -1,0,或 1。

public boolean equals(Object x)

普通 

 当且仅当指定的 Object 是一个其值在数字上等于此 BigInteger 的 BigInteger 时,返回 true。

更多方法实现请看api文档:http://tool.oschina.net/apidocs/apidoc?api=jdk-zh

BigDecimal基本操作:

BigDecimal 与 BigInteger 基本上操作方法都相同,加减乘除基本相似

import java.math.BigDecimal;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {

        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNext()) {
            BigDecimal one = scanner.nextBigDecimal();
            BigDecimal two = scanner.nextBigDecimal();
            System.out.println(one.compareTo(two));
            System.out.println(one.equals(two));
        }
        scanner.close();
    }
}

输入输出数据如下:

000000000000000001 1
0
true
00000000000001.0 1
0
false
1.0 1
0
false

  compareTo:值相等但具有不同标度的两个 BigDecimal 对象(如,2.0 和 2.00)被认为是相等的。当此 BigDecimal 在数字上小于、等于或大于 val 时,返回 -1、0 或 1。

  equals:仅当两个 BigDecimal 对象的值和标度都相等时,此方法才认为它们相等(因此通过此方法进行比较时,2.0 不等于 2.00)。当且仅当指定的 Object 为 BigDecimal,并且其值和标度都等于此 BigDecimal 的值和标度时,返回 true。

nlk
点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Gwendolyn62 Gwendolyn62
3年前
Python基本数据类型
在了解基本数据类型的时候,我们需要了解基本数据类型有哪些?数字int、布尔值bool、字符串str、列表list、元组tuple、字典dict等,其中包括他们的基本用法和其常用的方法,这里会一一列举出来,以便参考。然后我们还需要了解一些运算符,因为这些基本数据类型常常会用于一些运算等等。一、运算符  运算通常可以根据最终获得的值不同,可以
Wesley13 Wesley13
2年前
java.math.BigDecimal类的用法
在java中提供了大数字的操作类,即java.math.BinInteger类和java.math.BigDecimal类。这两个类用于高精度计算,其中BigInteger类是针对大整数的处理类,而BigDecimal类则是针对大小数的处理类。下边我们介绍BigDecimal类:BigDecimal的实现利用到了BigInteger,不同的是Big
Wesley13 Wesley13
2年前
Java日期时间API系列31
  时间戳是指格林威治时间1970年01月01日00时00分00秒起至现在的总毫秒数,是所有时间的基础,其他时间可以通过时间戳转换得到。Java中本来已经有相关获取时间戳的方法,Java8后增加新的类Instant等专用于处理时间戳问题。 1获取时间戳的方法和性能对比1.1获取时间戳方法Java8以前
Wesley13 Wesley13
2年前
FLV文件格式
1.        FLV文件对齐方式FLV文件以大端对齐方式存放多字节整型。如存放数字无符号16位的数字300(0x012C),那么在FLV文件中存放的顺序是:|0x01|0x2C|。如果是无符号32位数字300(0x0000012C),那么在FLV文件中的存放顺序是:|0x00|0x00|0x00|0x01|0x2C。2.  
Easter79 Easter79
2年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
2年前
JAVA 面试相关
1\.int和Integer有什么区别?答:Java是一个近乎纯洁的面向对象编程语言,但是为了编程的方便还是引入了基本数据类型,但是为了能够将这些基本数据类型当成对象操作,Java为每一个基本数据类型都引入了对应的包装类型(wrapperclass),int的包装类就是Integer,从Java5开始引入
Wesley13 Wesley13
2年前
Oracle一张表中实现对一个字段不同值和总值的统计(多个count)
需求:统计WAIT\_ORDER表中的工单总数、未处理工单总数、已完成工单总数、未完成工单总数。表结构:为了举例子方便,WAIT\_ORDER表只有两个字段,分别是ID、STATUS,其中STATUS为工单的状态。1表示未处理,2表示已完成,3表示未完成总数。 SQL:  1.SELECT   2
京东云开发者 京东云开发者
6个月前
Vitess全局唯一ID生成的实现方案 | 京东云技术团队
为了标识一段数据,通常我们会为其指定一个唯一id,比如利用MySQL数据库中的自增主键。但是当数据量非常大时,仅靠数据库的自增主键是远远不够的,并且对于分布式数据库只依赖MySQL的自增id无法满足全局唯一的需求。因此,产生了多种解决方案,如UUID,Sn