Java的大数操作分为BigInteger和BigDecimal,但这两给类是分开使用的,有时候在编程的时候显得略微繁琐,现在编写了一个将二者合二为一的大数操作类。

大数操作类代码如下:

 package blog;

 import java.math.BigDecimal;
import java.math.BigInteger;
import java.math.RoundingMode; /**
*
* @author 瓦尔登湖畔的小木屋
* BigNumberOperation封装了对十进制大数整数和大数浮点数的四则运算的操作
*/
public class BigNumberOperation {
/**
* 对加法的封装操作
*/
public static BigInteger add(BigInteger number1, BigInteger number2) {
return number1.add(number2);
} public static BigDecimal add(BigDecimal number1, BigDecimal number2) {
return number1.add(number2);
} public static BigDecimal add(BigDecimal number1, BigInteger number2) {
return number1.add(new BigDecimal(number2));
} public static BigDecimal add(BigInteger number1, BigDecimal number2) {
return new BigDecimal(number1).add(number2);
} /**
* 对减法的封装操作
*/
public static BigInteger subtract(BigInteger number1, BigInteger number2) {
return number1.subtract(number2);
} public static BigDecimal subtract(BigDecimal number1, BigDecimal number2) {
return number1.subtract(number2);
} public static BigDecimal subtract(BigDecimal number1, BigInteger number2) {
return number1.subtract(new BigDecimal(number2));
} public static BigDecimal subtract(BigInteger number1, BigDecimal number2) {
return new BigDecimal(number1).subtract(number2);
} /**
* 对乘法的封装操作
*/
public static BigInteger multiply(BigInteger number1, BigInteger number2) {
return number1.multiply(number2);
} public static BigDecimal multiply(BigDecimal number1, BigDecimal number2) {
return number1.multiply(number2);
} public static BigDecimal multiply(BigDecimal number1, BigInteger number2) {
return number1.multiply(new BigDecimal(number2));
} public static BigDecimal multiply(BigInteger number1, BigDecimal number2) {
return new BigDecimal(number1).multiply(number2);
} /**
* 对除法的封装
* 大数浮点数时,结果默认保留10位小数,也可以通过count指定保留小数的位数
* 对于最末一位的取舍采取RoundingMode.HALF_EVEN模式
*/
public static BigInteger divide(BigInteger number1, BigInteger number2) {
return number1.divide(number2);
} public static BigDecimal divide(BigDecimal number1, BigDecimal number2) {
return number1.divide(number2, 10, RoundingMode.HALF_EVEN);
} public static BigDecimal divide(BigDecimal number1, BigDecimal number2, int count) {
return number1.divide(number2, count, RoundingMode.HALF_EVEN);
} public static BigDecimal divide(BigDecimal number1, BigInteger number2) {
return number1.divide(new BigDecimal(number2), 10, RoundingMode.HALF_EVEN);
} public static BigDecimal divide(BigDecimal number1, BigInteger number2, int count) {
return number1.divide(new BigDecimal(number2), count, RoundingMode.HALF_EVEN);
} public static BigDecimal divide(BigInteger number1, BigDecimal number2) {
return new BigDecimal(number1).divide(number2, 10, RoundingMode.HALF_EVEN);
} public static BigDecimal divide(BigInteger number1, BigDecimal number2, int count) {
return new BigDecimal(number1).divide(number2, count, RoundingMode.HALF_EVEN);
}
/*
* 由于当两个大数都是字符串时,无法通过重载实现,所以才返回Number,以同时适应BigInteger和BigDecimal
*/
public static Number add(String number1, String number2) {
if (number1.matches("[0-9]+") && number2.matches("[0-9]+")) {
return new BigInteger(number1).add(new BigInteger(number2));
} else {
return new BigDecimal(number1).add(new BigDecimal(number2));
}
} public static Number subtract(String number1, String number2) {
if (number1.matches("[0-9]+") && number2.matches("[0-9]+")) {
return new BigInteger(number1).subtract(new BigInteger(number2));
} else {
return new BigDecimal(number1).subtract(new BigDecimal(number2));
}
} public static Number multiply(String number1, String number2) {
if (number1.matches("[0-9]+") && number2.matches("[0-9]+")) {
return new BigInteger(number1).multiply(new BigInteger(number2));
} else {
return new BigDecimal(number1).multiply(new BigDecimal(number2));
}
} public static Number divide(String number1, String number2) {
if (number1.matches("[0-9]+") && number2.matches("[0-9]+")) {
return new BigInteger(number1).divide(new BigInteger(number2));
} else {
return new BigDecimal(number1).divide(new BigDecimal(number2), 10, RoundingMode.HALF_EVEN);
}
} public static BigDecimal divide(String number1, String number2, int count) {
return new BigDecimal(number1).divide(new BigDecimal(number2), count, RoundingMode.HALF_EVEN);
}
}

测试代码如下:

 package blog;

 import java.math.BigDecimal;
import java.math.BigInteger; public class Main {
public static void main(String[] args) {
String str1 = "46556545";
String str2 = "45454545.45454544"; BigInteger num1 = new BigInteger(str1);
BigDecimal num2 = new BigDecimal(str2);
System.out.println("当两个参数是大数时的测试:");
System.out.println("大数加法的测试:");
System.out.println(num1 + " + " + num1 + " = " + BigNumberOperation.add(num1, num1));
System.out.println(num1 + " + " + num2 + " = " + BigNumberOperation.add(num1, num2));
System.out.println(num2 + " + " + num1 + " = " + BigNumberOperation.add(num2, num1));
System.out.println(num2 + " + " + num2 + " = " + BigNumberOperation.add(num2, num2));
System.out.println(); System.out.println("大数减法的测试:");
System.out.println(num1 + " - " + num1 + " = " + BigNumberOperation.subtract(num1, num1));
System.out.println(num1 + " - " + num2 + " = " + BigNumberOperation.subtract(num1, num2));
System.out.println(num2 + " - " + num1 + " = " + BigNumberOperation.subtract(num2, num1));
System.out.println(num2 + " - " + num2 + " = " + BigNumberOperation.subtract(num2, num2));
System.out.println(); System.out.println("大数乘法的测试:");
System.out.println(num1 + " * " + num1 + " = " + BigNumberOperation.multiply(num1, num1));
System.out.println(num1 + " * " + num2 + " = " + BigNumberOperation.multiply(num1, num2));
System.out.println(num2 + " * " + num1 + " = " + BigNumberOperation.multiply(num2, num1));
System.out.println(num2 + " * " + num2 + " = " + BigNumberOperation.multiply(num2, num2));
System.out.println(); System.out.println("大数除法的测试:");
System.out.println(num1 + " / " + num1 + " = " + BigNumberOperation.divide(num1, num1));
System.out.println(num1 + " / " + num2 + " = " + BigNumberOperation.divide(num1, num2));
System.out.println(num2 + " / " + num1 + " = " + BigNumberOperation.divide(num2, num1));
System.out.println(num2 + " / " + num2 + " = " + BigNumberOperation.divide(num2, num2));
System.out.println("大数除法保留五位小数:");
System.out.println(num1 + " / " + num2 + " = " + BigNumberOperation.divide(num1, num2, 5));
System.out.println(num2 + " / " + num1 + " = " + BigNumberOperation.divide(num2, num1, 5));
System.out.println(num2 + " / " + num2 + " = " + BigNumberOperation.divide(num2, num2, 5));
System.out.println(""); System.out.println("###############################################");
System.out.println("当两个参数为字符串是的测试:");
System.out.println("加法测试:");
System.out.println(str1 + " + " + str1 + " = " + BigNumberOperation.add(str1, str1));
System.out.println(str1 + " + " + str2 + " = " + BigNumberOperation.add(str1, str2));
System.out.println(str2 + " + " + str1 + " = " + BigNumberOperation.add(str2, str1));
System.out.println(str2 + " + " + str2 + " = " + BigNumberOperation.add(str2, str2));
System.out.println();
System.out.println("减法测试:");
System.out.println(str1 + " - " + str1 + " = " + BigNumberOperation.subtract(str1, str1));
System.out.println(str1 + " - " + str2 + " = " + BigNumberOperation.subtract(str1, str2));
System.out.println(str2 + " - " + str1 + " = " + BigNumberOperation.subtract(str2, str1));
System.out.println(str2 + " - " + str2 + " = " + BigNumberOperation.subtract(str2, str2));
System.out.println();
System.out.println("乘法测试:");
System.out.println(str1 + " * " + str1 + " = " + BigNumberOperation.multiply(str1, str1));
System.out.println(str1 + " * " + str2 + " = " + BigNumberOperation.multiply(str1, str2));
System.out.println(str2 + " * " + str1 + " = " + BigNumberOperation.multiply(str2, str1));
System.out.println(str2 + " * " + str2 + " = " + BigNumberOperation.multiply(str2, str2));
System.out.println();
System.out.println("除法测试:");
System.out.println(str1 + " / " + str1 + " = " + BigNumberOperation.divide(str1, str1));
System.out.println(str1 + " / " + str2 + " = " + BigNumberOperation.divide(str1, str2));
System.out.println(str2 + " / " + str1 + " = " + BigNumberOperation.divide(str2, str1));
System.out.println(str2 + " / " + str2 + " = " + BigNumberOperation.divide(str2, str2));
System.out.println();
System.out.println("除法测试:");
System.out.println(str1 + " / " + str1 + " = " + BigNumberOperation.divide(str1, str1, 5));
System.out.println(str1 + " / " + str2 + " = " + BigNumberOperation.divide(str1, str2, 5));
System.out.println(str2 + " / " + str1 + " = " + BigNumberOperation.divide(str2, str1, 5));
System.out.println(str2 + " / " + str2 + " = " + BigNumberOperation.divide(str2, str2, 5));
}
}

测试结果如下:

当两个参数是大数时的测试:
大数加法的测试:
46556545 + 46556545 = 93113090
46556545 + 45454545.45454544 = 92011090.45454544
45454545.45454544 + 46556545 = 92011090.45454544
45454545.45454544 + 45454545.45454544 = 90909090.90909088

大数减法的测试:
46556545 - 46556545 = 0
46556545 - 45454545.45454544 = 1101999.54545456
45454545.45454544 - 46556545 = -1101999.54545456
45454545.45454544 - 45454545.45454544 = 0E-8

大数乘法的测试:
46556545 * 46556545 = 2167511882337025
46556545 * 45454545.45454544 = 2116206590909090.23190480
45454545.45454544 * 46556545 = 2116206590909090.23190480
45454545.45454544 * 45454545.45454544 = 2066115702479337.5206611570247936

大数除法的测试:
46556545 / 46556545 = 1
46556545 / 45454545.45454544 = 1.0242439900
45454545.45454544 / 46556545 = 0.9763298684
45454545.45454544 / 45454545.45454544 = 1.0000000000
大数除法保留五位小数:
46556545 / 45454545.45454544 = 1.02424
45454545.45454544 / 46556545 = 0.97633
45454545.45454544 / 45454545.45454544 = 1.00000

###############################################
当两个参数为字符串是的测试:
加法测试:
46556545 + 46556545 = 93113090
46556545 + 45454545.45454544 = 92011090.45454544
45454545.45454544 + 46556545 = 92011090.45454544
45454545.45454544 + 45454545.45454544 = 90909090.90909088

减法测试:
46556545 - 46556545 = 0
46556545 - 45454545.45454544 = 1101999.54545456
45454545.45454544 - 46556545 = -1101999.54545456
45454545.45454544 - 45454545.45454544 = 0E-8

乘法测试:
46556545 * 46556545 = 2167511882337025
46556545 * 45454545.45454544 = 2116206590909090.23190480
45454545.45454544 * 46556545 = 2116206590909090.23190480
45454545.45454544 * 45454545.45454544 = 2066115702479337.5206611570247936

除法测试:
46556545 / 46556545 = 1
46556545 / 45454545.45454544 = 1.0242439900
45454545.45454544 / 46556545 = 0.9763298684
45454545.45454544 / 45454545.45454544 = 1.0000000000

除法测试:
46556545 / 46556545 = 1.00000
46556545 / 45454545.45454544 = 1.02424
45454545.45454544 / 46556545 = 0.97633
45454545.45454544 / 45454545.45454544 = 1.00000

Java大数操作类的更多相关文章

  1. JAVA文件操作类和文件夹的操作代码示例

    JAVA文件操作类和文件夹的操作代码实例,包括读取文本文件内容, 新建目录,多级目录创建,新建文件,有编码方式的文件创建, 删除文件,删除文件夹,删除指定文件夹下所有文件, 复制单个文件,复制整个文件 ...

  2. (转)Java大数操作(BigInteger、BigDecimal)

    基础知识 对于二进制来说,最高位代表正负号,-0表示-128,+0表示032位系统int型4个字节:-(2的31次方) ~ (2的31次方) 减 1最大负数:10000000 00000000 000 ...

  3. 关于Java大数操作(BigInteger、BigDecimal)

    本文目标 可以使用BigInteger操作大整数 可以使用BigDecimal指定小数的保留位数 基础知识 对于二进制来说,最高位代表正负号,-0表示-128,+0表示032位系统int型4个字节:- ...

  4. Java文件操作类效率对比

    前言 众所周知,Java中有多种针对文件的操作类,以面向字节流和字符流可分为两大类,这里以写入为例: 面向字节流的:FileOutputStream 和 BufferedOutputStream 面向 ...

  5. 并发库应用之二 & Java原子性操作类应用

    Java5的线程并发库中,提供了一组atomic class来帮助我们简化同步处理.基本工作原理是使用了同步synchronized的方法实现了对一个long, integer, 对象的增.减.赋值( ...

  6. Java 数学操作类

    数学操作类 Math类 数学计算操作类 类属性值 Math.E ^ Math.PI 圆周率 类方法 Math类中,一切方法都是 static 型,因为Math类中没有普通属性. round() 方法 ...

  7. Java大数操作

    Java的Math包中提供了两个类用于对大数进行操作: BigInteger类,用于大整数的操作 BigDecimal类,用于大的小数操作 BigInteger类 Java中的基本类型中,表示整数的有 ...

  8. Java大数处理类:BigInteger类和BigDecimal类

    当我们要处理非常大的数据时,平常用的数据类型已不足以表示,在Java中有两个类BigInteger和BigDecimal分别表示大整数类和大浮点数类,这两个类在理论上只要计算机内存足够大就能够表示无线 ...

  9. Java数据库操作类演示

    只在mysql上测试过,不知道算不算好使​1. [代码][Java]代码     package org.load.demo; import java.io.IOException;import ja ...

随机推荐

  1. mybatis 打印sql log配置

    mybatis 打印sql log, 方便调试.如何配置呢? log4j.xml : <!-- 打印sql start --> <appender name="IBatis ...

  2. MySQL数据库加密与解密

    数据加密.解密在安全领域非常重要.对程序员而言,在数据库中以密文方式存储用户密码对入侵者剽窃用户隐私意义重大. 有多种前端加密算法可用于数据加密.解密,下面我向您推荐一种简单的数据库级别的数据加密.解 ...

  3. cocos2d-x 聊天输入框实现

    转自:http://bbs.9ria.com/thread-216948-1-10.html 聊天输入框  (单行输入框 ,多行可自己扩展) 实现功能: 1.普通输入 2.设置输入框显示最大宽度(PT ...

  4. 友盟分享 -QQAPI- QQApi.m:250 param error: url is nil

    有一个项目 需要用到友盟分享,点击分享内容,需要跳转到指定的url,不带参数的url非常好跳,也没什么问题,但是 带了参数之后:比如http://121.43.121.8:8080/tj/photo/ ...

  5. 从零开始学android开发-四大组件之一 Activity

    1.Activity是Android四大组件(Application Components)之一,简单来说Activity就是平常所见到的用户界面,一般情况下,一个Activity所占的窗口是满屏的, ...

  6. VK Cup 2015 - Finals, online mirror D. Restructuring Company 并查集

    D. Restructuring Company Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/5 ...

  7. hdu 5432 Pyramid Split 二分

    Pyramid Split Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://bestcoder.hdu.edu.cn/contests/conte ...

  8. 该优化针对Linux X86_X64环境

    http://netkiller.github.io/www/tomcat/server.html 1. Tomcat优化其实就是对server.xml优化(开户线程池,调整http connecto ...

  9. android学习日记13--数据存储之File存储

    4.文件存储File File即传统的I/O 流存储文件,Activity提供了openFileOutput()方法可以用于把数据输出到文件中,具体的实现过程与在J2SE环境中保存数据到文件中是一样的 ...

  10. iOS 如何进行逆向工程

    原文:http://www.zhihu.com/question/20317296 季逸超,Peak-Labs创始人/CEO,猛犸浏览器.Rasgue- 有幸被邀请回答,不过不知道您要了解的'系统机制 ...