BigInteger和BigDecimal大数操作
有时候可能会碰到需要计算非常大的数,比如7777777777777777777777777*3333333333333333333333333333,这样的计算需要显然不能用之前的方式来进行。我们不能用任何的数据类型来装下这么大的数,它已经操作了int、float、double的数据类型的范围。那么如何解决这样的计算需求呢?这时候,就需要进行大数操作。
在java.math这个包中有两个进行大数操作的类:java.math.BigInteger和java.math.BigDecimal。从名字上可以知道这两个类的作用了吧。很明显,前者是进行整数的大数操作的,后者是进行小数的大数操作的。下面来看一下实例。
实例1:
importjava.math.BigInteger;
public classBigIntegerDemo01 {
public static voidmain(String[] args){
String num1="88379348888888478403839479";
String num2="838777777333333333337";
BigInteger big1=newBigInteger(num1);
BigInteger big2=newBigInteger(num2);
System.out.println(big1.add(big2));//加法操作
System.out.println(big1.subtract(big2));//加法操作
System.out.println(big1.multiply(big2));//乘法操作
System.out.println(big1.divide(big2));//除法操作
BigInteger[] result=big1.divideAndRemainder(big2);
System.out.println(big1.toString()+"/"+big2.toString()+"的商:"+result[0]);
System.out.println(big1.toString()+"/"+big2.toString()+"的余数:"+result[1]);
}
}
构造方法public BigInteger(String val)是 将 BigInteger 的十进制字符串表示形式转换为BigInteger。大整数操作可以像其它类型的数据一样进行加法、减法、乘法、除法等操作。
需要特别说明的是除法操作。public BigInteger divide(BigInteger val)这个方法只能得到一个“商“,要想的到余数需要用public BigInteger[] divideAndRemainder(BigInteger val)这个方法。divideAndRemainder()这个方法返回的是存储有”商“和”余数“的BigInteger数组。
下面看看BigDecimal如何使用。
实例2:
packagecn.tty.math;
importjava.math.BigDecimal;
public classBigDecimalDemo02 {
public static voidmain(String[] args) {
String num1="84995.333333333323";
String num2="894.99";
//保留5位小数
System.out.println(BigDecimalDemo02.round(BigDecimalDemo02.add(num1, num2), 5));
//保留4位小数
System.out.println(BigDecimalDemo02.round(BigDecimalDemo02.subtract(num1, num2), 4));
//保留3位小数
System.out.println(BigDecimalDemo02.round(BigDecimalDemo02.multiply(num1, num2), 3));
//保留2位小数
System.out.println(BigDecimalDemo02.divide(num1, num2,2));
}
public static doubleadd(String num1,String num2){
//将 BigDecimal 的字符串表示形式转换为BigDecimal
BigDecimal b1=newBigDecimal(num1);
BigDecimal b2=newBigDecimal(num2);
returnb1.add(b2).doubleValue();
}
public static doublesubtract(String num1,String num2){
//将 BigDecimal 的字符串表示形式转换为BigDecimal
BigDecimal b1=newBigDecimal(num1);
BigDecimal b2=newBigDecimal(num2);
returnb1.subtract(b2).doubleValue();
}
public static doublemultiply(String num1,String num2){
//将 BigDecimal 的字符串表示形式转换为BigDecimal
BigDecimal b1=newBigDecimal(num1);
BigDecimal b2=newBigDecimal(num2);
returnb1.multiply(b2).doubleValue();
}
public static doubledivide(String num1,String num2,int scale){
BigDecimal b1=newBigDecimal(num1);
BigDecimal b2=newBigDecimal(num2);
//下面的“2”表示需要保留的小数位数,“BigDecimal.ROUND_HALF_UP”常量表示的是四舍五入的模式
returnb1.divide(b2,scale,BigDecimal.ROUND_HALF_UP).doubleValue();
}
public static double round(doublenum1,int scale){
BigDecimal big1=newBigDecimal(num1);
BigDecimal big2=newBigDecimal(1);
returnbig1.divide(big2,scale,BigDecimal.ROUND_HALF_UP).doubleValue();//任何数除于1都等于本身
}
}
上面的例子重新包装了BigDecimal的加减乘除操作,是这些方法的使用更符合本例的需要。加减乘的操作就不用多说了,很直接,很简单,需要说明的还是除法操作。
BigDecimal的除法重载了很多。其中有一种是public BigDecimal divide(BigDecimal divisor,int scale,RoundingMode roundingMode)。这种方法指定了保留的小数位数(scale)和四舍五入的模式(roundingMode)。比如,“ROUND_HALF_DOWN“的模式表示向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则为上舍入的舍入模式。
//下面的操作不涉及大数操作的内容,但涉及到保留小数位数
doublex=874.748;
doubley=893.32;
doublez=x*y;
System.out.println("x * Y = "+z);
System.out.println("x * Y = "+(int)(z*10)/10.0);//保留1为小数
System.out.println("x * Y = "+(int)(z*100)/100.0);//保留2为小数
System.out.println("x * Y = "+(int)(z*1000)/1000.0);//保留3为小数
这种方式并不能完全指定四舍五入的小数位数,可以称之为“伪四舍五入“,因为这某种巧合的情况下,它并不能很好的实现指定小数位数的功能。比如x=874.738,y=893.32那么 z = 781420.9501600001。(int)(z*1000)/1000.0的输出结果仍为”781420.95“,并没有预想的保留3位小数。原因很简单,z*1000=781420950. 1600001,(int)(z*1000)= 781420950,那么(int)(z*1000)/1000.0=781420.95。因为末位是0,因此被舍掉了。
虽然这种方式的保留小数位数的方式不保险,但这种方式简单便捷,在要求并不严苛的情况下可以使用。
还有个四舍五入的方法,在java.lang.Math类中:
public static long round(double a)
public static int round(float a)
显然,这两个方法返回的数将是整型数据,并不会保留任何小数。
//使用java.text.DecimalFormat类实现四舍五入和保留指定位数的小数
packagecn.tty.format;
importjava.text.DecimalFormat;
public classDecimalFormatDemo02 {
public staticString round(String pattern,double value){
DecimalFormat formatter=newDecimalFormat(pattern);
String rv=formatter.format(value);
return rv;
}
public static voidmain(String[] args){
//指定模式:保留2为小数
String roundedValue=DecimalFormatDemo02.round("####.00",838.666);//保留两位小数
System.out.println(roundedValue);
}
}
BigInteger和BigDecimal大数操作的更多相关文章
- BigInteger和BigDecimal大数相加问题
package cn.hncu.big; import java.math.BigDecimal; public class BigDecimalDemo { public static void m ...
- Java的大数操作分为BigInteger和BigDecimal
Java的大数操作分为BigInteger和BigDecimal,但这两给类是分开使用的,有时候在编程的时候显得略微繁琐,现在编写了一个将二者合二为一的大数操作类. 大数操作类代码如下: 1 pack ...
- (转)Java大数操作(BigInteger、BigDecimal)
基础知识 对于二进制来说,最高位代表正负号,-0表示-128,+0表示032位系统int型4个字节:-(2的31次方) ~ (2的31次方) 减 1最大负数:10000000 00000000 000 ...
- 关于Java大数操作(BigInteger、BigDecimal)
本文目标 可以使用BigInteger操作大整数 可以使用BigDecimal指定小数的保留位数 基础知识 对于二进制来说,最高位代表正负号,-0表示-128,+0表示032位系统int型4个字节:- ...
- Java 大数类BigInteger和BigDecimal的基本函数
在Java中有两个类BigInteger和BigDecimal分别表示不可变的任意精度的整数和不可变的有符号的任意精度的十进制数(浮点数).主要用于高精度计算中.这两个类使得java中的大数,高精度运 ...
- Java从零开始学二十九(大数操作(BigIntger、BigDecimal)
一.BigInteger 如果在操作的时候一个整型数据已经超过了整数的最大类型长度long的话,则此数据就无法装入,所以,此时要使用BigInteger类进行操作. 不可变的任意精度的整数.所有操作中 ...
- Java大数操作类
Java的大数操作分为BigInteger和BigDecimal,但这两给类是分开使用的,有时候在编程的时候显得略微繁琐,现在编写了一个将二者合二为一的大数操作类. 大数操作类代码如下: packag ...
- Java中利用BigInteger类进行大数开方
在Java中有时会用到大数据,基本数据类型的存储范围已经不能满足要求了,如要对10的1000次方的这样一个数据规模的数进行开方运算,很明显不能直接用Math.sqrt()来进行计算,因为已经溢出了. ...
- Java基本的程序结构设计 大数操作
大数操作 BigInteger 不可变的任意精度的整数.所有操作中,都以二进制补码形式表示 BigInteger(如 Java 的基本整数类型).BigInteger 提供所有 Java 的基本整数操 ...
随机推荐
- pythonchallenge 解谜
所有代码均使用python 3.5.1 版本 最近在学python,闲来无事觉得这个解谜还挺有意思. 解谜网址 http://www.pythonchallenge.com/ 接下来会写破解教程~
- Objective-O Runtime 运行时初体验
Objective-C语言是一门动态语言,它将很多静态语言在编译和链接时期做的事放到了运行时来处理.这种动态语言的优势在于:我们写代码时更具灵活性,如我们可以把消息转发给我们想要的对象,或者随意交换一 ...
- window自动任务实现数据库定时备份
原理:利用window定时任务定时cmd加载mytask.bat文件,bat运行php.exe程序编译运行mytask.php文件 ,从而实现了数据库的备份 mytask.bat 内容: D:\php ...
- Jquery父页面和子页面的相互操作
//父页面调用子页面Add函数 $("iframe")[0].contentWindow.Add() //父页面对子页面Id为Sava的Dom元素执行一次单击操作 $(" ...
- Meteor 学习
官方网站 https://www.meteor.com/ 官方API手册 https://guide.meteor.com/ http://docs.meteor.com/ 中文网站 http://c ...
- 判断是否为IE浏览器
function isIE(){ if (!!window.ActiveXObject || "ActiveXObject" in window){ ...
- System memory,AGP memory和video memory【转】
system memory就是电脑的内存条上的,一般都很大.显卡不能访问 . video memory就是显示卡上的显存,一般是32,64,128M这样,速度最快,显卡可直接访问 .用来描述电脑上一 ...
- Ubuntu下的PHP开发环境架设
Ubuntu下的PHP开发环境架设 今天重新装了ubuntu那么就吧过程记录下. 打开终端,也就是命令提示符. 我们先来最小化组建安装,按照自己的需求一步一步装其他扩展.命令提示符输入如下命令: ...
- Android开发环境搭建之Eclipse/AndroidStudio
时隔两年之后,回头来整理曾经走过的Android开发之路.记录下开发环境的配置,也方便与新入门的小伙伴们快速搭建自己的Android平台. 一.Android SDK Manager 1.下载与安装[ ...
- 别再为了iOS新系统设备而重新安装一个新版Xcode了.其实我们可以添加版本支持
众所周知,Xcode7.3的代码补全是有问题的 如导入自定义类之后,在代码中并不会补全相应的类名... 但Xcode7.2是没有这个问题的,但很多时候我们自己的设备都升级到了iOS9.3.X系统,导 ...