`

Java 加减乘除精确运算

阅读更多
public final class MathUtil {
	/**
	 * 提供精度的比较运算
	 * 
	 * @param v1
	 * @param v2
	 * @return
	 * 小于、等于或大于时,返回 -1、0 或 1。
	 */
	public static int compareTo(double v1, double v2) {
		BigDecimal b1 = new BigDecimal(Double.toString(round(v1,10)));
		BigDecimal b2 = new BigDecimal(Double.toString(round(v2,10)));
		return b1.compareTo(b2);
	}
	
	public static int compareTo(double v1, double v2,int decimals) {
		v1 = MathUtil.round(v1, 3);
		v2 = MathUtil.round(v2, 3);
		BigDecimal b1 = new BigDecimal(Double.toString(v1));
		BigDecimal b2 = new BigDecimal(Double.toString(v2));
		return b1.compareTo(b2);
	}

	/**
	 * 
	 * 提供精确的加法运算。
	 * 
	 * @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();
//
//	}
	
	public static double add(double v1, double ... v2) {
		BigDecimal b = new BigDecimal(Double.toString(v1));
		for(int i=0;i<v2.length;i++){
			BigDecimal v3 = new BigDecimal(Double.toString(v2[i]));
			b = b.add(v3);
		}
		return b.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();
//	}
	
	public static double sub(double v,double...v1) {
		BigDecimal b = new BigDecimal(Double.toString(v));
		for(int i=0;i<v1.length;i++){
			BigDecimal v3 = new BigDecimal(Double.toString(v1[i]));
			b = b.subtract(v3);
		}
		return b.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();
//	}
	public static double mul(double v1, double ... v2) {
		
		BigDecimal b = new BigDecimal(Double.toString(v1));
		for(int i=0;i<v2.length;i++){
			BigDecimal v3 = new BigDecimal(Double.toString(v2[i]));
			b = b.multiply(v3);
		}
		return b.doubleValue();
	}

	/**
	 * 
	 * 提供(相对)精确的除法运算,当发生除不尽的情况时,精确到
	 * 
	 * 小数点以后10位,以后的数字四舍五入。
	 * 
	 * @param v1
	 *            被除数
	 * 
	 * @param v2
	 *            除数
	 * 
	 * @return 两个参数的商
	 */

	public static double div(double v1, double v2) {
		return div(v1, v2, DEF_DIV_SCALE);
	}

	/**
	 * 
	 * 提供(相对)精确的除法运算。当发生除不尽的情况时,由scale参数指
	 * 
	 * 定精度,以后的数字四舍五入。
	 * 
	 * @param v1
	 *            被除数
	 * 
	 * @param v2
	 *            除数
	 * 
	 * @param scale
	 *            表示表示需要精确到小数点以后几位。
	 * 
	 * @return 两个参数的商
	 */

	public static double div(double v1, double v2, int scale) {
		if (scale < 0) {
			throw new IllegalArgumentException(
					"The scale must be a positive integer or zero");
		}
		BigDecimal b1 = new BigDecimal(Double.toString(v1));
		BigDecimal b2 = new BigDecimal(Double.toString(v2));
		//log.info("b1="+b1+",b2="+b2);
		return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
	}

	/**
	 * 
	 * 提供精确的小数位四舍五入处理。
	 * 
	 * @param v
	 *            需要四舍五入的数字
	 * 
	 * @param scale
	 *            小数点后保留几位
	 * 
	 * @return 四舍五入后的结果
	 */

	public static double round(double v, int scale) {
		if (scale < 0) {
			throw new IllegalArgumentException(
					"The scale must be a positive integer or zero");
		}
		BigDecimal b = new BigDecimal(Double.toString(v));
		BigDecimal one = new BigDecimal("1");
		if (scale > 4) {
			StringBuffer sb = new StringBuffer();
			sb.append("0.");
			for (int i = 0; i < scale; i++) {
				sb.append("0");
			}
			String str = sb.toString();
			return Double.valueOf(new java.text.DecimalFormat(str)
					.format(b.divide(one, scale, BigDecimal.ROUND_HALF_UP)
							.doubleValue()));
		}
		return Double.valueOf(new java.text.DecimalFormat("0.0000").format(b
				.divide(one, scale, BigDecimal.ROUND_HALF_UP).doubleValue()));
	}
}

分享到:
评论

相关推荐

    BigDecimal 加减乘除运算

    Java中BigInteger的数学运算,BigDecimal 加减乘除运算,Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。双精度浮点型变量double可以处理16位有效数。在实际应用中,需要对更大...

    java 实现加减乘除

    根据给定的文件信息,我们可以总结出以下关于Java实现加减乘除运算的相关知识点: ### 一、程序结构与组织 这段代码展示了一个简单的Java程序,用于执行基本的算术运算(加法、减法、乘法和除法)。程序通过用户...

    加减乘除精确算法

    标题提到的"加减乘除精确算法"就是为了解决这个问题而设计的。 这个工具类的主要功能是提供对浮点数的精确运算,确保在进行加、减、乘、除操作时不会因为浮点数表示的不精确性而导致错误的结果。通常,这种精确运算...

    Java 加减乘除工具类(解决精度损失问题)

    唔,其实里面就是一个工具类,加减乘除、保留两位小数。一共5个方法。。。emmmm.....为啥分这么高呢。因为宝宝想分想疯了。 附代码,有土豪就打赏打赏,没土豪的直接拿去使吧。 package cn.cisdom.base.utils; ...

    【Java】BigDecimal实现加减乘除运算代码

    `BigDecimal`类提供了加减乘除等运算方法,确保了计算结果的精确性。本文将详细介绍如何使用`BigDecimal`实现加减乘除运算。 首先,`BigDecimal`有多种构造方法,这里主要提及两种: 1. `BigDecimal(double val)`:...

    分数的加减乘除运算Rational Numbers

    – Java提供了整数和浮点数的数据类型,但是没有提供有理数的类型。 – 由于有理数与整数、浮点数有许多共同特征,并且Number类是数字包装的根类,因此,把有理数类Rational定义为Number类的一个子类是比较合适的。...

    我做的多则运算支持括号加减乘除

    标题中的“我做的多则运算支持括号加减乘除”指的是一个计算器程序,它能够处理包含括号的数学表达式,并执行基本的四则运算(加法、减法、乘法和除法)。这个计算器是由Java编程语言实现的,显示了开发者在编程和...

    javascrpt的加减乘除运算

    ### JavaScript中的精确加减乘除运算 在JavaScript中进行数学计算时,经常会出现精度丢失的问题,尤其是在处理小数运算时尤为明显。这是因为JavaScript中的数字是以双精度浮点数(64位)形式存储的,遵循IEEE 754...

    sizeyunsuan.rar_加减乘除 四则运算_四则运算

    在IT领域,尤其是在编程和计算机科学中,四则运算(加减乘除)是基本的数学操作,它们构成了计算逻辑的基础。"sizeyunsuan.rar_加减乘除 四则运算_四则运算"这个标题暗示了我们将讨论的是如何在编程环境中执行这些...

    BigDecimal加减乘除计算.pdf

    本篇文章将详细探讨`BigDecimal`在加减乘除运算中的应用及其注意事项。 首先,`BigDecimal`对象的初始化有两种常见方式。一种是直接传入一个数字,如`new BigDecimal(0.005)`,另一种是传入一个字符串,如`new ...

    高精度 加减乘除 代码

    这里我们以Pascal语言为例,探讨如何编写高精度加、减、乘法的源代码。 1. **高精度加法**: 在Pascal程序`gaojing_jia`中,首先定义了一个常量`n`来表示数组的长度,这将决定可以处理的最大位数。然后,定义了两...

    计算器--简单的加减乘除

    例如,他们可能选择了使用大数库,以保证在进行加减乘除时,无论是简单的小数还是复杂的运算,都能得到精确的结果。此外,他们可能还考虑了用户的需求,提供了一定的精度设置选项,让用户可以根据实际需要调整计算的...

    aaa.rar_JAVA 用户 界面 加减乘除_Java GUI计算器_aaa_java 混合 运算 计算器_计算器

    这个"aaa.rar"压缩包包含的项目是创建一个Java GUI计算器,支持加、减、乘、除以及混合运算。让我们深入探讨这个项目中的关键知识点。 1. **Java Swing或JavaFX**: 为了构建GUI,开发者可能使用了Java Swing库或者...

    Java对BigDecimal常用方法的归类(加减乘除).doc

    Java 中的 BigDecimal 类提供了对浮点数的精确运算,包括加减乘除和四舍五入等操作。在 Java 中,简单类型不能够精确地对浮点数进行运算,因此需要使用 BigDecimal 类来提供精确的浮点数运算。 加法运算 在 Java ...

    大数四则运算(大数加减乘除,无限位数运算)

    更高效的方法有舍入除法和迭代除法,这些方法可以逐步逼近精确结果。 6. **无限位数运算**:在计算机中,大数运算可以理论上进行无限位数,只要内存足够。然而,实际应用中通常会受到可用内存的限制。因此,为了...

    java_资金运算工具类_提供精确的加减乘除法等运算

    提供精确的加法运算 提供精确的减法运算 提供精确的乘法运算 精确的除法运算. 提供(相对)精确的除法运算。当发生除不尽的情况时,由scale参数指定精度,以后的数字四舍五入 提供精确的小数位四舍五入处理 取余数 ...

    提供精 确的浮点数运算,包括加减乘除和四舍五入

    由于Java的简单类型不能够精确的对浮点数进行运算,这个工具类提供精 确的浮点数运算,包括加减乘除和四舍五入。

    加减乘除.rar

    在IT领域,尤其是在编程和计算机科学中,"加减乘除"是基本的数学运算,它们构成了所有复杂计算的基础。这些运算符在几乎所有的编程语言中都有所体现,包括C,C++,Java,Python,JavaScript等。让我们深入探讨一下...

    Java中BigDecimal的加减乘除、比较大小与使用注意事项

    在Java编程中,当涉及到需要精确数值计算的场景时,我们通常会使用`BigDecimal`类。这是因为`float`和`double`类型虽然适用于科学计算和工程计算,但它们基于二进制浮点运算,不能保证完全精确的结果。而`BigDecimal...

    使用BigDecimal进行精确运算(实现加减乘除运算)

    使用BigDecimal进行精确运算的步骤如下: 1. **创建BigDecimal对象**:你可以通过传入String表示的数值来创建BigDecimal对象,或者使用`BigDecimal.valueOf()`静态方法,将基本类型(如double)转换为BigDecimal。...

Global site tag (gtag.js) - Google Analytics