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端的小数计算的精度不足而发愁过呢 其实有个不错的资源可以利用。 引用附件的JS,就可以轻松搞定JS的计算问题了。 使用例 <!-- function //+ alert(new BigDecimal("10").add(new BigDecimal("3E+...
本项目“MyEditTextApplication”专注于使用BigDecimal进行输入框内的价格计算,确保计算结果的高度精确,尤其是在处理小数点后的多位数字时。 BigDecimal是Java提供的一个大数类,它可以用来进行精确的浮点数运算...
总之,BigDecimal 是 Java 中用于高精度计算的关键工具,通过其提供的方法和舍入模式,可以确保在财务等对精度有严格要求的场景下进行准确的计算。在实际编程中,应优先使用字符串构造 BigDecimal 对象,并合理设置...
### BigDecimal的计算 #### 概述 在Java中,`BigDecimal` 类提供了对超过16位有效数字的十进制数进行精确算术运算的能力。它适用于金融计算、科学计算等场景,在这些场景中,使用浮点数(如 `float` 和 `double`)...
在Java编程语言中,`BigDecimal`类是用于表示和操作大数(通常涉及财务或精确数学计算)的重要工具。由于浮点数(如`float`和`double`)在计算机中是以近似值存储的,这可能导致计算结果的不精确性,尤其是在进行...
Java中的`BigDecimal`类是用于表示和操作高精度浮点数的重要工具,尤其适用于需要进行精确计算的场景,如财务和货币计算。由于基本数据类型`double`和`float`在进行大数值或高精度计算时可能会导致精度丢失,因此`...
在商业计算中,确保精度不丢失是至关重要的,因为哪怕是最微小的计算误差也可能导致重大的财务损失。本文以项目实践为背景,探讨如何在实际开发中避免精度丢失问题,主要关注数据类型的选择和计算操作。 首先,解决...
总的来说,JavaScript版`BigDecimal`类库为开发者提供了一种解决JavaScript精度问题的工具,使得在进行金融计算、科学计算或其他需要高精度计算的场合下,能够得到准确的结果。通过学习和应用这个库,开发者可以更好...
float和double只能用来做科学计算或者是工程计算,在商业计算中要用java.math.BigDecimal。BigDecimal所创建的是对象,我们不能使用传统的+、-、*、/等算术运算符直接对其对象进行数学运算,而必须调用其相对应的...
BigDecimal工具类提供了多种精确的数学运算方法,满足了我们在实际开发中对高精确计算的需求。同时,该工具类还提供了很多实用的方法,使得我们可以更方便地进行数学运算。 知识点: 1. BigDecimal工具类是Java中...
在实际应用中,BigDecimal.js可以用于电商系统的订单总价计算、金融应用的汇率转换、科学计算等场景,确保计算结果的精确性。 总之,BigDecimal.js是一个强大的JavaScript库,专门用于处理大数的高精度计算,通过...
在Java编程语言中,当我们处理涉及货币、财务或者任何需要高精度计算的场景时,`BigDecimal` 类是非常重要的工具之一。本文将深入探讨 `BigDecimal` 类的基本概念、特点以及如何使用它来进行精确的算术运算。 #### ...
复杂的BigDecimal计算,需要开方的式子,可输入结果精确位数
在Java编程语言中,BigDecimal是一种用于处理高精度数值的数据类型,尤其适用于金融计算等领域,因为它可以提供不受限的小数位数精度以及精确的数学运算能力。然而,在某些情况下,我们可能需要将BigDecimal类型的值...
BigDecimal 是 Java 中一个用于处理金融和商业应用的类,其主要功能是提供高精度的数字计算。下面是关于 BigDecimal 的使用方法和注意事项: 1. 导包:在使用 BigDecimal 之前,需要导入 java.math.BigDecimal 包。...
BigDecimal 类详解 BigDecimal 类是 Java 中的一种数值类型,主要用于处理超过 16 位有效数字的数值运算。该类提供了多种构造器和方法,用于创建和操作 BigDecimal 对象。 构造器 BigDecimal 类提供了四种构造器...
在进行商业计算时,由于浮点数(double和float)存在精度问题,不能保证准确的结果,因此通常推荐使用BigDecimal来确保计算的精确性。本文将深入探讨BigDecimal的基本操作、应用场景及注意事项。 首先,创建...
在处理货币计算、金融数据或其他需要精确数值计算的场景中,`BigDecimal`是不可或缺的工具。 1. 创建BigDecimal对象: 创建`BigDecimal`对象通常有两种方式,一是通过`new BigDecimal(String)`构造器,二是通过`...
在Java编程语言中,BigDecimal类是用于处理高精度、大范围浮点数的工具,它在需要精确计算的场景下非常关键。BigDecimal提供了避免浮点数运算中的精度损失的方法,适用于金融、会计等对精度有严格要求的领域。这篇...
`BigDecimal` 用于处理精确的浮点数运算,适合财务或金融计算,因为它可以避免浮点数计算中的精度问题。而 `Integer` 是 Java 中的整数类型,它只能存储整数值。在某些情况下,我们可能需要将 `BigDecimal` 对象转换...