`

处理大数字

    博客分类:
  • J2SE
 
阅读更多
/**
 * 处理大数字
 * <p>高精度浮点数BigDecimal
 * 它可以表示任意精度的小数,并对它们进行计算
 * 由于BigDecimal对象是不可变的,这些方法中的每一个都会产生新的BigDecimal对象
 * 因此,因为创建对象的开销,BigDecimal不适合于大量的数学计算,但设计它的目的是用来
 * 精确地表示小数
 */
public class BigNumber 
{
	/**默认除法运算精度,即保留小数点多少位*/
	private static final int DEFAULT_DIV_SCALE =10;
	
	/**
	 * 构造函数私有,表示这个类不能实例化
	 */
	private BigNumber()
	{
		
	}
	
	/**
	 * 提供精确的加法运算
	 * @param v1 被加数
	 * @param v2 加数
	 * @return 两个参数的和
	 */
	public static double add(double v1,double v2)
	{
		BigDecimal b1 = new BigDecimal(Double.toString(v1));
		BigDecimal b2 = new BigDecimal(Double.toString(v2));
		return (b1.add(b2)).doubleValue();
	}
	
	/**
	 * 提供精确的减法运算
	 * @param v1 被减数
	 * @param v2 减数
	 * @return 两个参数的差
	 */
	public static double sub(double v1,double v2)
	{
		BigDecimal b1 = new BigDecimal(Double.toString(v1));
		BigDecimal b2 = new BigDecimal(Double.toString(v2));
		return (b1.subtract(b2)).doubleValue();
	}
	
	/**
	 * 提供精确的乘法运算
	 * @param v1 被乘数
	 * @param v2 乘数
	 * @return 两个参数的积
	 */
	public static double mul(double v1,double v2)
	{
		BigDecimal b1 = new BigDecimal(Double.toString(v1));
		BigDecimal b2 = new BigDecimal(Double.toString(v2));
		return (b1.multiply(b2)).doubleValue();
	}
	
	/**
	 * 提供(相对)精确的除法运算,当发生除不尽的情况时,精确到小数点以后多少位,以后的
	 * 数字四舍五入
	 * @param v1 被除数
	 * @param v2 除数
	 * @return 两个参数的商
	 */
	public static double div(double v1,double v2)
	{
		return div(v1, v2, DEFAULT_DIV_SCALE);
	}
	
	/**
	 * 提供(相对)精确的除法运算,当发生除不尽的情况时,由scale参数指定
	 * 精度,以后的数字四舍五入
	 * @param v1 被除数
	 * @param v2 除数
	 * @param scale 两个参数的商
	 * @return
	 */
	public static double div(double v1,double v2,int scale)
	{
		if(scale<0)
		{
			System.err.println("除法精度必须大于0!");
			return 0;
		}
		BigDecimal b1 = new BigDecimal(Double.toString(v1));
		BigDecimal b2 = new BigDecimal(Double.toString(v2));
		return (b1.divide(b2,scale,BigDecimal.ROUND_HALF_UP)).doubleValue();
	}
	
	/**
	 * 计算Factorial阶层
	 * @param n 任意大于等于0的int
	 * @return n!的值
	 */
	public static BigInteger getFactorial(int n)
	{
		if(n<0)
		{
			System.err.println("n必须大于等于0!");
			return new BigInteger("-1");
		}
		else if(n==0)
		{
			return new BigInteger("0");
		}
		//将数组转换成字符串后构造BigInteger
		BigInteger result = new BigInteger("1");
		for(;n>0;n--)
		{
			//将数字n转换成字符串后,再构造一个BigInteger对象,与现有结果做乘法
			result = result.multiply(new BigInteger(new Integer(n).toString()));
		}
		return result;
	}
	
	public static void main(String args[])
	{
		//计算阶乘,可以将n设得更大
		int n=50;
		System.out.println("计算n的阶乘" + n + "!= " + BigNumber.getFactorial(n));
		
		//用double构造BigDecimal
		BigDecimal bd1 = new BigDecimal(0.1);
		System.out.println("(bd1=new BigDecimal(0.1)) = " + bd1.toString());
		
		//用String构造BigDecimal
		BigDecimal bd2 = new BigDecimal("0.1");
		System.out.println("(bd2 = new BigDecimal(\"0.1\")) = " + bd2.toString());
		
		BigDecimal bd3 = new BigDecimal("0.10");
		//equals方法比较两个BigDecimal对象是否相等
		System.out.println("bd2.equals(bd3) = " + bd2.equals(bd3));
		//compareTo方法比较两BigDecimal对象大小,相等返回0,小于返回-1,大于返回1
		System.out.println("bd2.compareTo(bd3) = " + bd2.compareTo(bd3));
		
		//进行精确计算
		System.out.println("0.05 + 0.01 = " + BigNumber.add(0.05, 0.01));
		System.out.println("1.0 - 0.42 = " + BigNumber.sub(1.0, 0.42));
		System.out.println("4.015 * 100 = " + BigNumber.mul(4.015, 100));
		System.out.println("123.3 / 100 = " + BigNumber.div(123.3, 100));
	}
}
分享到:
评论

相关推荐

    python处理大数字的方法

    ### Python处理大数字的方法 在Python编程中,处理大数字是一项常见的需求,特别是在涉及到数学运算、数据处理或算法实现时。Python内置了强大的整数类型,可以处理任意大小的整数,这使得它成为处理大数字的理想...

    西华大学数字图像处理PPT.rar

    《西华大学数字图像处理PPT》是一份深入讲解数字图像处理理论与实践的教育资源,主要针对"数字图形学"这一领域。这份PPT详细涵盖了数字图像处理的基础知识、核心算法以及实际应用,旨在帮助学习者理解和掌握图像处理...

    东南大学数字信号处理期末复习

    《东南大学数字信号处理期末复习》是一份针对东南大学9系计算机系学生的期末复习资料,旨在帮助学生系统地理解和掌握数字信号处理的核心概念、理论与应用。数字信号处理是计算机科学与工程领域的一个重要分支,它...

    2017年西安邮电大学数字信号处理考研复试真题及参考答案

    《2017年西安邮电大学数字信号处理考研复试真题及参考答案》这份资料是针对准备参加西安邮电大学数字信号处理专业硕士研究生复试的考生的重要参考资料。数字信号处理是电子信息科学中的核心课程,它涉及到信号的采集...

    广东工业大学数字图像处理历年试卷及答案大集合

    《广东工业大学数字图像处理历年试卷及答案大集合》是一份极具价值的学习资源,它涵盖了广东工业大学在2007年、2008年、2011年和2012年的数字图像处理课程的考试试卷及相应的答案。这份资料的特别之处在于,它不仅...

    广东工业大学数字信号处理实验报告

    【广东工业大学数字信号处理实验报告】是...总的来说,这份实验报告为学生提供了一个实践数字信号处理理论的平台,通过亲手操作和理解代码,可以加深对这一领域的理解,对于未来在相关领域的工作或研究具有极大的帮助。

    东南大学 数字信号处理实验报告及代码

    《东南大学数字信号处理实验报告及代码》是一个深入学习和实践数字信号处理的宝贵资源,涵盖了快速傅里叶变换(FFT)、IIR数字滤波器设计以及FIR数字滤波器设计的关键知识点。这些主题在现代通信、图像处理、音频...

    上海大学数字图像处理习题答案

    数字图像处理习题及答案 一台光导摄像管摄像机的靶直径为25mm,感应点直径为35微米。若像素间距与点直径相同,它数字化一幅正方形图像时的最大行数和列数是多少?若要数字化的图像为480 ×640像素,靶上的最大像素...

    12位大数字计算器.rar

    这可能是为了解决用户在长时间处理大数字计算时的视觉疲劳问题,提供了一个更为人性化的设计。 标签“12位大数字计算器.rar”再次强调了这个软件的主要功能和文件类型。.rar是一种常见的压缩文件格式,用于将多个...

    数学计算器-12位大数字计算器

    "数学计算器-12位大数字计算器"就是这样一款专为处理大数字设计的工具,它能够支持12位以上的数字运算,极大地满足了用户对精确计算的需求。 首先,我们要了解12位大数字的概念。在计算机科学中,数字的表示通常受...

    西安交通大学数字信号处理实验报告-频率采样型滤波器

    《西安交通大学数字信号处理实验报告-频率采样型滤波器》 本实验报告主要探讨了数字信号处理中的一种重要工具——频率采样型滤波器。这种滤波器是基于频率采样理论构建的,它由梳状滤波器和一系列谐振器并联组成。...

    西北工业大学西工大数字图像处理实验报告.docx

    【数字图像处理】是计算机科学领域的一个重要分支,主要研究如何对图像进行处理、分析和理解。本实验报告涵盖了五个核心实验,旨在让学生深入理解数字图像处理的基本概念、原理和算法,并通过编程实现来加深对理论...

    重庆大学数字信号处理PPT

    - 1965年,Cooley和Tukey提出快速傅里叶变换(FFT),极大地简化了信号频谱分析,推动了数字信号处理理论的成熟。 - 七十年代,大规模集成电路和芯片技术的发展,为数字信号处理提供了硬件支持,使其得以广泛应用。 ...

    广东工业大学数字信号处理复习资料.rar

    研究生阶段数字信号处理课程相关资料

    东南大学数字信号处理

    《东南大学数字信号处理》是一门深入探讨数字信号处理理论与应用的课程,旨在帮助学生理解和掌握这一领域的重要概念和技术。数字信号处理是现代通信、音频处理、图像处理、计算机科学等多个领域不可或缺的基础,它...

    西北工业大学西工大数字信号处理.rar

    《西北工业大学西工大数字信号处理》是一套涵盖了数字信号处理基础理论与实践的资料集,主要用于学习交流。这份压缩包包含的章节丰富,涵盖了数字信号处理的主要领域,旨在帮助学习者深入理解这一领域的核心概念和...

    东南大学 数字信号处理PPT

    《数字信号处理》是东南大学研究生第一学年的一门重要课程,主要针对电子工程、通信工程、计算机科学等领域的学生开设。这门课程的核心在于理解并掌握如何在数字域内分析、变换、处理以及应用各种信号,对于深入理解...

    西工大数字图像处理教程2

    《西北工业大学数字图像处理教程2》是一门深入探讨图像处理技术的课程,由著名教育家林增刚教授主讲。本教程涵盖了多个关键领域,旨在帮助学习者掌握数字图像处理的基础理论与实践应用。以下是对压缩包中各文件内容...

    北京邮电大学-数字信号处理-期末复习资料.pdf

    14. 实际应用中的数字信号处理问题:讨论在实际应用中遇到的数字信号处理问题和挑战,例如实现高效算法、数字信号处理器编程、实时信号处理等。 以上是数字信号处理领域的一些基础和高级知识点。为了更好地复习和...

Global site tag (gtag.js) - Google Analytics