`
xwood
  • 浏览: 102948 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

商业计算——BigDecimal

阅读更多
    BigDecimal表示不可变的、任意精度的有符号十进制数,由任意精度的整数非标度值 和 32 位的整数标度 (scale) 组成。所表示数字如果为零或正数,则标度是小数点后的位数。如果为负数,则将该数的非标度值乘以 10 的负 scale 次幂。因此,BigDecimal 表示的数值是 (unscaledValue × 10-scale)。
    另外,BigDecimal 类提供以下操作:算术、标度操作、舍入、比较、哈希算法和格式转换。toString() 方法提供 BigDecimal 的规范表示形式。
public class BigDecimalNewUtil {
	
	public static void main(String[] args){
		
		String val1 = "12.36547";
		String val2 = "1587.235";
		
		/*
		 * 加法1
		 * 
		 * MathContext有两个属性:
		 * precision:指定数字的有效位数。如1.256E+2,表示有效位数4位
		 * RoundingMode:指定在将数字转为有效位数时采用的舍入模式
		 */
		MathContext mctx = new MathContext(2, RoundingMode.HALF_UP);
		System.out.println("---- add method using MathContext:" + add(val1, val2, mctx));
		
		int scale = 3;		
		//在java 1.5之前,使用BigDecimal.roundingMode属性指定,如: int roundingMode = BigDecimal.ROUND_HALF_UP;
		RoundingMode roundingMode = RoundingMode.HALF_UP;
		
		//加法2
		System.out.println("---- add method using scale and RoundingMode:" + add(val1, val2, scale, roundingMode));
		
		//除法
		System.out.println("---- divide method using scale and RoundingMode:" + divide(val1, val2, scale, roundingMode));
		
		//舍入1
		System.out.println("---- round method using scale and RoundingMode:" + round(Double.parseDouble(val1), scale, roundingMode));
		
		/*
		 * 舍入2
		 * BigDecimal提供直接舍入方法,其结果与我们使用round()方法相同
		 */
		BigDecimal bval = new BigDecimal(val1);
		System.out.println("---- round method using BigDeciaml.setScale:" + bval.setScale(scale, roundingMode));
		
		
		/*----------------------运行结果如下--------------------
		*---- add method using MathContext:1.6E+3
		*---- add method using scale and RoundingMode:1599.6
		*---- divide method using scale and RoundingMode:0.0080
		*---- round method using scale and RoundingMode:12.365
		*---- round method using BigDeciaml.setScale:12.365
		*/
	}
	
	/**
     * 提供精确的加法运算
     * @param val1 被加数
     * @param val2 加数
     * @return 和
     */
    public static double add(String val1, String val2){
    	BigDecimal bval1= new BigDecimal(val1);
    	BigDecimal bval2 = new BigDecimal(val2);
    	return bval1.add(bval2).doubleValue();
    }
    
    /**
     * 提供带舍入模式的加法运算
     * @param val1 被加数
     * @param val2 加数
     * @param scale 舍入精度
     * @param roundingMode 舍入模式
     * @return 舍入和
     */
    public static double add(String val1, String val2, int scale, RoundingMode roundingMode){
    	BigDecimal bval1= new BigDecimal(val1);
    	BigDecimal bval2 = new BigDecimal(val2);
    	double val = bval1.add(bval2).doubleValue();
    	return round(val, scale, roundingMode);
    }
    
    /**
     * 提供指定和有效数字的加法运算
     * @param val1 被加数
     * @param val2 加数
     * @param mctx 指定和有效数字及舍入模式的context
     * @return 舍入和
     */
    public static String add(String val1, String val2, MathContext mctx){
    	BigDecimal bval1= new BigDecimal(val1);
    	BigDecimal bval2 = new BigDecimal(val2);
    	return bval1.add(bval2, mctx).toString();
    }
    
    /**
     * 提供精确的减法运算
     * @param val1 被减数
     * @param val2 减数
     * @return 差
     */
    public static double subtract(String val1, String val2){
    	BigDecimal bval1 = new BigDecimal(val1);
    	BigDecimal bval2 = new BigDecimal(val2);
    	return bval1.subtract(bval2).doubleValue();
    }
    
    /**
     * 提供舍入的减法运算
     * @param val1 被减数
     * @param val2 减数
     * @param scale 舍入精度
     * @param roundingMode 舍入模式
     * @return 舍入差
     */
    public static double subtract(String val1, String val2, int scale, RoundingMode roundingMode){
    	BigDecimal bval1 = new BigDecimal(val1);
    	BigDecimal bval2 = new BigDecimal(val2);
    	double val = bval1.subtract(bval2).doubleValue();
    	return round(val, scale, roundingMode);
    }
    
    /**
     * 提供精确的乘法运算
     * @param val1 被乘数
     * @param val2 乘数
     * @return 积
     */
    public static double multiply(String val1, String val2){
    	BigDecimal bval1 = new BigDecimal(val1);
    	BigDecimal bval2 = new BigDecimal(val2);
    	return bval1.multiply(bval2).doubleValue();
    }
    
    /**
     * 提供舍入的乘法运算
     * @param val1 被乘数
     * @param val2 乘数
     * @param scale 舍入精度
     * @param roundingMode 舍入模式
     * @return 舍入积
     */
    public static double multiply(String val1, String val2, int scale, RoundingMode roundingMode){
    	BigDecimal bval1 = new BigDecimal(val1);
    	BigDecimal bval2 = new BigDecimal(val2);
    	double val = bval1.multiply(bval2).doubleValue();
    	return round(val, scale, roundingMode);
    }
    
    /**
     * 提供带指定精度的除法
     * @param val1 被除数
     * @param val2 除数
     * @param scale 舍入精度
     * @param roundingMode 舍入模式
     * @return 舍入商
     */
    public static double divide(String val1, String val2, int scale, RoundingMode roundingMode){
    	if(scale < 0){
    		throw new IllegalArgumentException("The scale must be a positive integer or zero");
    	}
    	BigDecimal bval1= new BigDecimal(val1);
    	BigDecimal bval2 = new BigDecimal(val2);
    	return bval1.divide(bval2, scale, roundingMode).doubleValue();
    }
    
    /**
     * 提供精确的小数位舍入处理
     * @param val 需要舍入的数字
     * @param scale 小数点后保留几位
     * @param roundingMode 舍入模式
     * @return 舍入后的结果
     */
    public static double round(double val, int scale, RoundingMode roundingMode){
    	return divide(String.valueOf(val), "1", scale, roundingMode);
    }
    
}
分享到:
评论

相关推荐

    JS的高精度计算(BigDecimal)

    你是否因为JS端的小数计算的精度不足而发愁过呢 其实有个不错的资源可以利用。 引用附件的JS,就可以轻松搞定JS的计算问题了。 使用例 &lt;!-- function //+ alert(new BigDecimal("10").add(new BigDecimal("3E+...

    MyEditTextApplication输入框BigDecimal计算价格

    本项目“MyEditTextApplication”专注于使用BigDecimal进行输入框内的价格计算,确保计算结果的高度精确,尤其是在处理小数点后的多位数字时。 BigDecimal是Java提供的一个大数类,它可以用来进行精确的浮点数运算...

    BigDecimal加减乘除计算

    总之,BigDecimal 是 Java 中用于高精度计算的关键工具,通过其提供的方法和舍入模式,可以确保在财务等对精度有严格要求的场景下进行准确的计算。在实际编程中,应优先使用字符串构造 BigDecimal 对象,并合理设置...

    BigDecimal的计算

    ### BigDecimal的计算 #### 概述 在Java中,`BigDecimal` 类提供了对超过16位有效数字的十进制数进行精确算术运算的能力。它适用于金融计算、科学计算等场景,在这些场景中,使用浮点数(如 `float` 和 `double`)...

    BigDecimal计算

    在Java编程语言中,`BigDecimal`类是用于表示和操作大数(通常涉及财务或精确数学计算)的重要工具。由于浮点数(如`float`和`double`)在计算机中是以近似值存储的,这可能导致计算结果的不精确性,尤其是在进行...

    关于java中BigDecimal的简介(csdn)————程序.pdf

    Java中的`BigDecimal`类是用于表示和操作高精度浮点数的重要工具,尤其适用于需要进行精确计算的场景,如财务和货币计算。由于基本数据类型`double`和`float`在进行大数值或高精度计算时可能会导致精度丢失,因此`...

    【项目实践】商业计算怎样才能保证精度不丢失(csdn)————程序.pdf

    在商业计算中,确保精度不丢失是至关重要的,因为哪怕是最微小的计算误差也可能导致重大的财务损失。本文以项目实践为背景,探讨如何在实际开发中避免精度丢失问题,主要关注数据类型的选择和计算操作。 首先,解决...

    javascript版BigDecimal类库

    总的来说,JavaScript版`BigDecimal`类库为开发者提供了一种解决JavaScript精度问题的工具,使得在进行金融计算、科学计算或其他需要高精度计算的场合下,能够得到准确的结果。通过学习和应用这个库,开发者可以更好...

    BigDecimal 加减乘除运算

    float和double只能用来做科学计算或者是工程计算,在商业计算中要用java.math.BigDecimal。BigDecimal所创建的是对象,我们不能使用传统的+、-、*、/等算术运算符直接对其对象进行数学运算,而必须调用其相对应的...

    BigDecimal工具类.docx

    BigDecimal工具类提供了多种精确的数学运算方法,满足了我们在实际开发中对高精确计算的需求。同时,该工具类还提供了很多实用的方法,使得我们可以更方便地进行数学运算。 知识点: 1. BigDecimal工具类是Java中...

    BigDecimal.js.zip

    在实际应用中,BigDecimal.js可以用于电商系统的订单总价计算、金融应用的汇率转换、科学计算等场景,确保计算结果的精确性。 总之,BigDecimal.js是一个强大的JavaScript库,专门用于处理大数的高精度计算,通过...

    bigdecimal

    在Java编程语言中,当我们处理涉及货币、财务或者任何需要高精度计算的场景时,`BigDecimal` 类是非常重要的工具之一。本文将深入探讨 `BigDecimal` 类的基本概念、特点以及如何使用它来进行精确的算术运算。 #### ...

    BigDecimal开n次方根

    复杂的BigDecimal计算,需要开方的式子,可输入结果精确位数

    BigDecimal向Double转换

    在Java编程语言中,BigDecimal是一种用于处理高精度数值的数据类型,尤其适用于金融计算等领域,因为它可以提供不受限的小数位数精度以及精确的数学运算能力。然而,在某些情况下,我们可能需要将BigDecimal类型的值...

    BigDecimal使用

    BigDecimal 是 Java 中一个用于处理金融和商业应用的类,其主要功能是提供高精度的数字计算。下面是关于 BigDecimal 的使用方法和注意事项: 1. 导包:在使用 BigDecimal 之前,需要导入 java.math.BigDecimal 包。...

    BigDecimal类

    BigDecimal 类详解 BigDecimal 类是 Java 中的一种数值类型,主要用于处理超过 16 位有效数字的数值运算。该类提供了多种构造器和方法,用于创建和操作 BigDecimal 对象。 构造器 BigDecimal 类提供了四种构造器...

    java中BigDecimal的操作方法

    在进行商业计算时,由于浮点数(double和float)存在精度问题,不能保证准确的结果,因此通常推荐使用BigDecimal来确保计算的精确性。本文将深入探讨BigDecimal的基本操作、应用场景及注意事项。 首先,创建...

    运用BigDecimal精确计算

    在处理货币计算、金融数据或其他需要精确数值计算的场景中,`BigDecimal`是不可或缺的工具。 1. 创建BigDecimal对象: 创建`BigDecimal`对象通常有两种方式,一是通过`new BigDecimal(String)`构造器,二是通过`...

    java BigDecimal操作

    在Java编程语言中,BigDecimal类是用于处理高精度、大范围浮点数的工具,它在需要精确计算的场景下非常关键。BigDecimal提供了避免浮点数运算中的精度损失的方法,适用于金融、会计等对精度有严格要求的领域。这篇...

    bigdecimal转integer.docx

    `BigDecimal` 用于处理精确的浮点数运算,适合财务或金融计算,因为它可以避免浮点数计算中的精度问题。而 `Integer` 是 Java 中的整数类型,它只能存储整数值。在某些情况下,我们可能需要将 `BigDecimal` 对象转换...

Global site tag (gtag.js) - Google Analytics