标签:string result 使用 浮点数 超过 1.2 mes 导致 不能
BigDecimal使用整理
一、 BigDecimal简介
计算机计算中无论是float还是double都是浮点数,由于计算机是二进制的,导致在在浮点数计算时会出现精度丢失,因此引入BigDecimal(java.math.BigDecimal)。
Java在java.math包中提供的 API类BigDecimal,用来对超过16位有效位的数进行精确的运算。双精度浮点型变量double可以处理16位有效数。在实际应用中,需要对更大或者更小的数进行运算和处理。float和double只能用来做科学计算或者是工程计算,在商业计算中要用 java.math.BigDecimal(BigDecimal)所创建的是对象,我们不能使用传统的+、-、*、/等算术运算符直接对其对象进行数学运算,而必须调用BigDecimal相对应的方法。方法中的参数也必须是BigDecimal的对象。
二、 BigDecimal构造方法
Bigdecimal构造时,不要直接使浮点数作为构造方法的参数,这样会出现精度丢失的问题。
Bigdecimal构造时使用BigDecimal.valueOf()方法,或者使用字符串作为BigDecimal构造方法的参数,避免精度丢失的问题。
例如:
? BigDecimal b1 = new BigDecimal("1.23");//1.23
? BigDecimal b2 = BigDecimal.valueOf(1.23);//1.23
? BigDecimal b3 = new BigDecimal(String.valueof(1.23));//1.23
精度丢失例如:
BigDecimal one1 = new BigDecimal(1.23); // 则结果会出现精度问题, 相应值会变成1.229999999999999982236431605997495353221893310546875
另外除了这两种外,特殊的像0、1、10可以这样写。
1. BigDecimal zero = BigDecimal.ZERO;
2. BigDecimal one = BigDecimal.ONE;
3. BigDecimal ten = BigDecimal.TEN;
三、 BigDecimal的加减乘除运算
? public BigDecimal add(BigDecimal value); // 加法
? public BigDecimal subtract(BigDecimal value); // 减法
? public BigDecimal multiply(BigDecimal value); // 乘法
? public BigDecimal divide(BigDecimal value); // 除法
BigDecimal的运算都没有对原值进行操作,而是返回一个新的BigDecimal对象。
四、 BigDecimal的比较方法(compareTo和equals对比)
BigDecimal在数字上小于、等于或大于被比较对象时,返回 -1、0或 1。
例如:
BigDecimal one = BigDecimal.valueOf(1);
BigDecimal two = new BigDecimal("2");
BigDecimal three = one.add(two);
int i1 = one.compareTo(two); // -1
int i2 = two.compareTo(two); // 0
int i3 = three.compareTo(two); // 1
注意值相等但具有不同精度的两个BigDecimal对象(如,1.0 和 1.00)被认为是相等的。
注意BigDecimal的比较运算最好不要用equals实现,因为BigDecimal的equals方法在比较的时候要比较两个数值的精度。
// 精度不同,数值不相等
BigDecimal decimal1 = BigDecimal.valueOf(0);
BigDecimal decimal2 = new BigDecimal("0.00");
System.out.println("the result is " +decimal1.equals(decimal2)); // false
// 设置为相同精度后再次比较
BigDecimal decimal3 = BigDecimal.valueOf(0).setScale(2);
BigDecimal decimal4 = new BigDecimal("0.00").setScale(2);
System.out.println("the result is " +decimal3.equals(decimal4)); // true
使用BigDecimal类equals方法判断两个BigDecimal类型的数据时,需要设置精度,否则结果可能不正确
标签:string result 使用 浮点数 超过 1.2 mes 导致 不能
原文地址:https://www.cnblogs.com/widget90/p/9504012.html