有时候可能会碰到需要计算非常大的数,比如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]);

}

}

构造方法publicBigInteger(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,Stringnum2,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的除法重载了很多。其中有一种是publicBigDecimal divide(BigDecimal divisor,int scale,RoundingModeroundingMode)。这种方法指定了保留的小数位数(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 longround(double a)

public static intround(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为小数

StringroundedValue=DecimalFormatDemo02.round("####.00",838.666);//保留两位小数

System.out.println(roundedValue);

}

}

BigInterger相关推荐

  1. Biginterger 解决多边形对角线点数问题

    题目描述 对于一个N个定点的凸多边形,他的任何三条对角线都不会交于一点.请求楚图形中对角线交点的个数. 例如,6边形:N边形的对角线条数为:n(n-3)/2 因为每一个交点对应两条对角线,而两条对角线 ...

  2. 大整数BigInterger的简单入门(vector实现)

    什么是大整数BigInteger? 假设某一数字有1000位,一般这种数字就是就叫BigInteger,这种数字即使使用unsigned long long 类型也无法表示(unsigned long ...

  3. 20155325 2016-2017-2 《Java程序设计》第3周学习总结

    教材学习内容总结 别用==直接比较浮点数运算结果. Integer默认值-128到127,若超出,需要修改系统属性,所以最好通过equals()比较. 系统错误提示:若超出数组范围,则显示ArrayI ...

  4. (JAVA)超大整数运算

    package com.book.lite;import java.math.BigInteger;/*** @author zhangyu* @date 2021年08月21日 4:27 下午* B ...

  5. [你必须知道的.NET]第三十一回,深入.NET 4.0之,从“新”展望

    总体来说,这是一篇介绍性的文章,不会涉及过多技术细节和研究过程.但是,作为拉开序幕的第一页,本文以提纲挈领的方式展开对.NET 4.0的初次体验.从What's new的角度,开始我对.NET 4.0 ...

  6. Java 蓝桥杯 常用核心类

    目录标题 Math类 基本类型的转换 BigInterger和BigDecimal类 Math类 double m=-13.35;double x=23.4;double n=Math.abs(m); ...

  7. .net core精彩实例分享 -- 字符串处理

    文章目录 介绍 具体案例 处理超大整数 获取指定日期的农历日期 输出百分比 输出多个币种格式 数字的两种常用格式 自定义小数位数 总结 介绍 随着.net core越来越流行,对.net core 基 ...

  8. math java 计算_Java中的数学计算函数汇总

    Math类:  java.lang.Math类中包含基本的数字操作,如指数.对数.平方根和三角函数. java.math是一个包,提供用于执行任意精度整数(BigInteger)算法和任意精度小数(B ...

  9. 【java笔记】大数操作(BigIntegerBigDecimal)

    如果操作的时候,一个整数数据已经超过了整数的最大类型长度long的话,则此数据就无法装入,所以,此时要使用BigInteger类进行操作 导包:import java.math 方法列表: 描述 Bi ...

最新文章

  1. 三台机器之间root用户ssh互信配置
  2. Model Selection Evaluation
  3. AOP配置开发入门案例
  4. ASP.NET性能优化小结(ASP.NETC#)(转)
  5. futuretask java 并发请求_Java面试题整理一(侧重多线程并发)
  6. 最新公布,“中国开发者大调查”第四批中奖名单来啦
  7. CoreMotion 框架
  8. 浅谈压缩感知(二十二):压缩感知重构算法之正则化正交匹配追踪(ROMP)
  9. 英文单词 modal 模态,flex里取模糊之意
  10. python可变参数_Python学习之路:函数传递可变参数与不可变参数,每天学一点点...
  11. NVIDIA控制面板打不开
  12. npm ERR network Invalid response body while trying to fetch
  13. hive中 <> 和 != 的区别
  14. python进阶之进程池multiprocessing.Pool
  15. 一段集大成的thymeleaf代码
  16. Vue3-浏览器兼容性 IE篇
  17. 『原创』ewebeditor 2.1.6 上传漏洞利用工具
  18. 文本文档改扩展名之后没反应、格式不变之解决办法
  19. geoCoordMap数据,全国省市,4个直辖市,用于echart gl 3d地图
  20. python 绘制函数曲线图

热门文章

  1. 小红书商城整店商品API接口(店铺所有商品接口)
  2. 深入学习设计模式之---单例模式
  3. 30款 香水品牌logo设计灵感 - logo设计公司 - ci设计
  4. cesium学习--初识
  5. 真正带防红的短网址源码
  6. Optimus: An Efficient Dynamic Resource Scheduler for Deep Learning Clusters(论文笔记)
  7. usb蓝牙适配器 linux,树莓派用USB蓝牙适配器连接蓝牙设备
  8. 计算机应用基础168页,计算机应用基础(2013年修订版)_IT168文库.pdf
  9. 基于JSP(java)网络百宝箱的设计和实现
  10. 电子设计大赛-信号产生电路