精度问题
由于二进制浮点数表示法的限制,浮点数可能无法精确表示某些小数。这可能导致精度丢失问题。如果需要更高的精度,可以使用 BigDecimal 类。例如:
import java.math.BigDecimal;
BigDecimal num2 = new BigDecimal("3.14159265359");
BigDecimal 允许你精确地控制小数的精度,但它的运算和比较操作可能会比普通的浮点数类型更复杂。
使用
Decimal对象创建
方式一:
BigDecimal bigDecimal = BigDecimal.valueOf(2.233348);
方式二:
BigDecimal num2 = new BigDecimal("3.14159265359");
对Decimal对象进行求和
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
public class BigDecimalSumExample {
public static void main(String[] args) {
// 创建一个包含 BigDecimal 元素的列表
List<BigDecimal> numbers = new ArrayList<>();
numbers.add(new BigDecimal("10.5"));
numbers.add(new BigDecimal("20.2"));
numbers.add(new BigDecimal("15.8"));
// 初始化一个 BigDecimal 用于存放求和结果
BigDecimal sum = BigDecimal.ZERO;
// 遍历列表并累加元素到求和结果
for (BigDecimal number : numbers) {
sum = sum.add(number);
}
// 打印求和结果
System.out.println("Sum: " + sum);
}
}
在对Decimal数字进行求和时,使用的是Decimal对象的add()方法,例如上面代码中的for循环中代码。
控制Decimal对象精度
Decimal类有一个方法setScale(),是用来对Decimal对象设置精度的。使用方式如下
public static void main(String[] args) {
BigDecimal bigDecimal = BigDecimal.valueOf(2.233348);
System.out.println("bigDecimal = " + bigDecimal);
//小数点后保留3位,舍取方式为四舍五入(RoundingMode.HALF_UP)
//setScale有三个重载方法,具体请看官方api
//取舍方式有多重,具体请看官方api
BigDecimal bigDecimal1 = bigDecimal.setScale(3, RoundingMode.HALF_UP);
System.out.println("bigDecimal = " + bigDecimal);
System.out.println("bigDecimal1 = " + bigDecimal1);
}
运行结果:
bigDecimal = 2.233348
bigDecimal = 2.233348 //原对象没有被改变
bigDecimal1 = 2.233 //setScale返回的对象
Process finished with exit code 0
由上面的运行结果可以看出,当使用一个数字进行创建Decimal时,他并不会对这个数字做出精度的取舍,创建的时候用什么就是什么。
还有,在调用setDecimal方法后会返回一个Decimal对象,这个对象就是精度处理后的decimal对象,原有对象并不会被改变,这一点需要注意。