Java——BigDecimal 笔记

这篇笔记介绍了Java中的BigDecimal类,强调了其在精度方面的优势。主要涵盖了构造方法,包括从double、int和String创建BigDecimal对象;加减乘除的基本运算;以及使用setScale()方法进行四舍五入,包括ROUND_DOWN、ROUND_UP、ROUND_HALF_UP和ROUND_HALF_DOWN四种舍入模式的详细说明。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

BigDecimal 比Double, float更加精确,你记住这个就行啦!

1.构造方法

 public BigDecimal(double val)    将double表示形式转换为BigDecimal *不建议使用

 public BigDecimal(int val)  将int表示形式转换成BigDecimal

    public BigDecimal(String val)  将String表示形式转换成BigDecimal

2.加减乘除

public BigDecimal add(BigDecimal value);                        //加法

public BigDecimal subtract(BigDecimal value);                   //减法 

public BigDecimal multiply(BigDecimal value);                   //乘法

public BigDecimal divide(BigDecimal value);                     //除法

3. 四舍五入

BigDecimal.setScale()方法用于格式化小数点

setScale(1)表示保留一位小数,默认用四舍五入方式 

setScale(1,BigDecimal.ROUND_DOWN)直接删除多余的小数位,如2.35会变成2.3 

setScale(1,BigDecimal.ROUND_UP)进位处理,2.35变成2.4 

setScale(1,BigDecimal.ROUND_HALF_UP)四舍五入,2.35变成2.4

setScaler(1,BigDecimal.ROUND_HALF_DOWN)四舍五入,2.35变成2.3,如果是5则向下舍

import java.math.BigDecimal;
import java.util.*;
public class Main{
	public static void main(String []argc) {
		double x = 1;
		double y = 3;
		double res = x/y * 1000000;
		int n;
//将求得数据,转换为BigDecimal, 之后将其四舍五入,然后取int值与618034比较,其实就是求比值四舍五入后已经达到了与 0.618034 一致的精度。只是转为为618034
		while(618034 != new BigDecimal(String.valueOf(res)).setScale(0, BigDecimal.ROUND_HALF_UP).intValue()) {
			double temp = x + y;
			x = y;
			y = temp;
			res = x/y * 1000000;
		}
		System.out.println((int)x + "/" + (int) y);
	}
}

 

### Java Stream 对 BigDecimal 类型数据进行求和操作 在 Java 8 中,`Stream` API 提供了强大的功能来处理集合中的元素。对于 `BigDecimal` 类型的数据,由于其不可变性以及精度要求,不能直接使用 `sum()` 方法,而需要通过 `reduce()` 方法来实现求和操作。 以下是一个完整的示例代码,展示如何使用 Java Stream 对 `BigDecimal` 类型的数据进行求和操作: ```java import java.math.BigDecimal; import java.util.Arrays; import java.util.List; public class BigDecimalSumExample { public static void main(String[] args) { List<BigDecimal> bigDecimals = Arrays.asList( new BigDecimal("10.5"), new BigDecimal("20.3"), new BigDecimal("30.2") ); BigDecimal sum = bigDecimals.stream() .reduce(BigDecimal.ZERO, BigDecimal::add); System.out.println("Sum of BigDecimals: " + sum); } } ``` 上述代码中,`reduce()` 方法的第一个参数是初始值(这里是 `BigDecimal.ZERO`),第二个参数是一个二元操作符,用于将流中的每个元素逐步累加到结果中[^1]。 如果需要对包含 `BigDecimal` 字段的对象列表进行求和操作,可以结合 `map()` 方法提取字段后再进行求和。例如: ```java import java.math.BigDecimal; import java.util.Arrays; import java.util.List; class Product { private String name; private BigDecimal price; public Product(String name, BigDecimal price) { this.name = name; this.price = price; } public BigDecimal getPrice() { return price; } } public class BigDecimalSumExample { public static void main(String[] args) { List<Product> products = Arrays.asList( new Product("Product A", new BigDecimal("10.5")), new Product("Product B", new BigDecimal("20.3")), new Product("Product C", new BigDecimal("30.2")) ); BigDecimal total = products.stream() .map(Product::getPrice) .reduce(BigDecimal.ZERO, BigDecimal::add); System.out.println("Total Price: " + total); } } ``` 在此示例中,`map()` 方法被用来从 `Product` 对象中提取 `price` 字段,然后通过 `reduce()` 方法完成求和操作[^4]。 此外,当需要对分组后的数据进行求和时,可以结合 `Collectors.groupingBy` 和 `Collectors.reducing` 方法。例如: ```java import java.math.BigDecimal; import java.util.*; import java.util.stream.Collectors; class Product { private String category; private BigDecimal price; public Product(String category, BigDecimal price) { this.category = category; this.price = price; } public String getCategory() { return category; } public BigDecimal getPrice() { return price; } } public class GroupedBigDecimalSumExample { public static void main(String[] args) { List<Product> products = Arrays.asList( new Product("Electronics", new BigDecimal("10.5")), new Product("Electronics", new BigDecimal("20.3")), new Product("Books", new BigDecimal("5.2")), new Product("Books", new BigDecimal("7.8")) ); Map<String, BigDecimal> result = products.stream() .collect(Collectors.groupingBy( Product::getCategory, Collectors.reducing( BigDecimal.ZERO, Product::getPrice, BigDecimal::add ) )); result.forEach((category, total) -> System.out.println("Category: " + category + ", Total Price: " + total)); } } ``` 此代码片段展示了如何根据 `category` 字段对 `Product` 列表进行分组,并计算每组的总价格[^4]。 ### 注意事项 - 在使用 `reduce()` 方法时,确保提供一个合理的初始值(如 `BigDecimal.ZERO`),以避免潜在的空指针异常。 - 如果数据集中可能存在 `null` 值,建议在流操作前进行过滤,例如使用 `filter(Objects::nonNull)`[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值