Java BigDecimal类常用方法大全

本文详细介绍了Java中BigDecimal类的使用方法,包括构造函数、常见数学运算及小数点处理技巧。强调了在商业计算中使用BigDecimal的重要性,以及如何避免精度丢失,确保计算的准确性。

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

1.简介

BigDecimal类位于java.math.BigDecimal包下。使用此类可以完成大的小数操作,而且也可以使用此类进行精确的四舍五入,这一点在开发中经常使用。

对于不需要任何准确计算精度的程序可以直接使用float或double完成,但是如果需要精确计算结果,则必须使用BigDecimal类。

2.BigDecimal类常用方法

2.1.BigDecimal(String val):构造方法,将String类型转换成BigDecimal类型数据。

2.2.BigDecimal(double val):构造方法,将double类型转换成BigDecimal类型数据。

2.3.BigDecimal(int val):构造方法,将int类型转换成BigDecimal类型数据。


2.4.BigDecimal add(BigDecimal value):加法,求两个BigDecimal类型数据的和。


2.5.BigDecimal subtract(BigDecimal value):减法,求两个BigDecimal类型数据的差。

2.6.BigDecimal multiply(BigDecimal  value):乘法,求两个BigDecimal类型数据的积。

2.7.BigDecimal divide(BigDecimal divisor):除法,求两个BigDecimal类型数据的商。

2.8.BigDecimal remainder(BigDecimal divisor):求余数,求BigDecimal类型数据除以divisor的余数。

2.9.BigDecimal max(BigDecimal value):最大数,求两个BigDecimal类型数据的最大值。

2.10.BigDecimal min(BigDecimal value):最小数,求两个BigDecimal类型数据的最小值。

2.11.BigDecimal abs():绝对值,求BigDecimal类型数据的绝对值。

2.12.BigDecimal negate():相反数,求BigDecimal类型数据的相反数。

代码:

BigDecimal  a=new BigDecimal ("4.5");
        BigDecimal  b=new BigDecimal ("1.5");
        BigDecimal  c=new BigDecimal ("-10.5");
 
        BigDecimal  add_result=a.add(b);
        BigDecimal  subtract_result=a.subtract(b);
        BigDecimal  multiply_result=a.multiply(b);
        BigDecimal  divide_result=a.divide(b);
        BigDecimal  remainder_result=a.remainder(b);
        BigDecimal  max_result=a.max(b);
        BigDecimal  min_result=a.min(b);
        BigDecimal  abs_result=c.abs();
        BigDecimal  negate_result=a.negate();
 
        Log.d("TAG","4.5+1.5="+add_result);
        Log.d("TAG","4.5-1.5="+subtract_result);
        Log.d("TAG","4.5*1.5="+multiply_result);
        Log.d("TAG","4.5/1.5="+divide_result);
        Log.d("TAG","4.5/1.5余数="+remainder_result);
        Log.d("TAG","4.5和1.5最大数="+max_result);
        Log.d("TAG","4.5和1.5最小数="+min_result);
        Log.d("TAG","-10.5的绝对值="+abs_result);
        Log.d("TAG","4.5的相反数="+negate_result);

结果:

4.5+1.5=6.0
4.5-1.5=3.0
4.5*1.5=6.75
4.5/1.5=3
4.5/1.5余数=0.0
4.5和1.5最大数=4.5
4.5和1.5最小数=1.5
-10.5的绝对值=10.5
4.5的相反数=-4.5
这里有一点需要注意的是除法运算divide。


BigDecimal除法可能出现不能整除的情况,比如 4.5/1.3,这时会报错java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result。

其实divide有三个参数的方法

BigDecimal divide(BigDecimal divisor, int scale, int roundingMode)

第一参数表示除数。

第二个参数表示小数点后保留位数。

第三个参数表示舍入模式。只有在作除法运算或四舍五入时才用到舍入模式。

舍入模式有下面这几种:

   ROUND_CEILING    //向正无穷方向舍入


   ROUND_DOWN    //向零方向舍入


   ROUND_FLOOR    //向负无穷方向舍入


   ROUND_HALF_DOWN    //向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,向下舍入,      例如1.55 保留一位小数结果为1.5


   ROUND_HALF_EVEN    //向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,如果保留位      数是奇数,使用ROUND_HALF_UP,如果是偶数,使用ROUND_HALF_DOWN


   ROUND_HALF_UP    //向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,向上舍入, 1.55    保留一位小数结果为1.6


   ROUND_UNNECESSARY    //计算结果是精确的,不需要舍入模式


   ROUND_UP    //向远离0的方向舍入

代码:

BigDecimal a=new BigDecimal("4.5");
        BigDecimal b=new BigDecimal("1.5");
        BigDecimal c=new BigDecimal("2");
 
        BigDecimal result1=a.divide(b,2,BigDecimal.ROUND_HALF_UP);
        BigDecimal result2=a.divide(c,2,BigDecimal.ROUND_HALF_UP);
        Log.d("TAG","4.5/1.5="+result1);
        Log.d("TAG","4.5/2="+result2);
结果:

4.5/1.5=3.00
4.5/2=2.25

3.BigDecimal 小数点处理

需求:计算结果保留三位小数。

代码:

 /**
         * 方式1
         * 0.000:三位小数 同理 0.00:两位小数 依次类推...
         * */
 
        double a=3.154215;
        DecimalFormat myformat=new java.text.DecimalFormat("0.000");
        String result1 = myformat.format(a);
        Log.d("TAG",a+"保留三位小数:"+result1);
 
        /**
         * 方式2
         * #.000:三位小数 同理 #.00:两位小数
         * */
 
        double b=3.256321;
        DecimalFormat   df=new DecimalFormat("#.000");
        String result2=df.format(b);
        Log.d("TAG",b+"保留三位小数:"+result2);
 
        /**
         * BigDecimal类操作保留几位小数
         * */
 
        double   c=3.558525;
        BigDecimal   bigDecimal=new   BigDecimal(c);
        double result3=bigDecimal.setScale(3,   BigDecimal.ROUND_HALF_UP).doubleValue();
        Log.d("TAG",c+"保留三位小数并四舍五入:"+result3);

结果:

3.154215保留三位小数:3.154
3.256321保留三位小数:3.256
3.558525保留三位小数并四舍五入:3.559

4.总结:

(1)商业计算使用BigDecimal。

(2)尽量使用参数类型为String的构造函数。

(3) BigDecimal都是不可变的(immutable)的,在进行每一步运算时,都会产生一个新的对象,所以在做加减乘除运算时千万要保存操作后的值。
 

 

注意
1. double参数的构造方法,不允许使用!因为它不能精确的得到相应的值,值会变大;
2. String构造方法是完全可预知的:写入newBigDecimal("0.1")将创建一个BigDecimal,它正好等于预期的0.1;因此,通常建议优先使用String构造方法;
3. 静态方法valueOf(doubleval)内部实现,仍是将double类型转为String类型;
4. BigDecimal都是不可变的(immutable)的,在进行每一步运算时,都会产生一个新的对象,所以在做加减乘除运算时千万要保存操作后的值。
 

<think>嗯,用户想找类似LangChain框架或工具。首先,我得回忆一下LangChain的主要功能。LangChain主要是用来开发基于大型语言模型(LLM)的应用,提供模块化组件,比如链、代理、记忆等,方便构建复杂的应用。所以用户可能是在寻找其他能够简化LLM应用开发的库或者框架。 接下来,我需要想想有哪些类似的工具。之前了解过一些,比如LlamaIndex,它专注于数据连接和检索,适合需要处理大量文档的场景。然后是Haystack,由Deepset开发,强调可扩展的检索增强生成(RAG),可能也是一个选项。还有Dust,设计模块化和协作式AI工作流的,可能适合团队使用。 另外,用户提到的引用里提到了Dask和Ray的调度策略不同,可能用户对分布式处理也有兴趣?不过这里主要是寻找LangChain的替代品,所以可能不需要深入调度策略,但可以稍微提一下这些框架是否支持分布式处理,比如Ray的引用可能相关。 还要考虑用户可能的实际需求,比如是否需要高效的检索、模块化设计、可视化界面等。比如Haystack有REST API和可视化调试工具,这对开发者来说可能很有用。LlamaIndex的数据连接和结构化输出可能对处理文档有帮助。 还要检查是否有其他库,比如Semantic Kernel,这是微软开发的,支持C#和Python,可能适合需要多语言支持的用户。HuggingFace的Transformers虽然主要是模型库,但结合其他工具也能构建类似应用,不过可能不如专门框架方便。 生成相关问题的时候,需要考虑用户可能进一步的问题,比如如何选择框架、各框架优缺点、性能比较、集成外部工具的能力,以及自建框架的可能性。这样能帮助用户更全面地了解选项,做出决策。 最后,确保回答结构清晰,每个工具的介绍包括核心功能、适用场景和特点,引用相关的资料,比如引用里的Dask和Ray的区别,可能和分布式处理有关联,但可能用户更关注功能对比。需要确保每个点都准确,并且推荐根据具体需求来选择,比如数据密集型用LlamaIndex,需要分布式用Ray,模块化用Dust等。</think>以下是一些可以替代 LangChain框架和工具库,根据其核心功能分为三类: ### 一、基于工作流设计的工具 1. **LlamaIndex** 专注于数据连接与检索增强生成(RAG),提供结构化数据加载接口(如PDF、CSV)和向量检索优化功能。支持通过$retrieval\_score = \text{BM25}(query, doc)$实现混合搜索[^3]。 2. **Haystack** 由Deepset开发,提供可视化流水线调试工具,支持通过REST API部署检索系统。其核心公式可表示为: $$ \text{Pipeline} = \text{Retriever} \rightarrow \text{Ranker} \rightarrow \text{Generator} $$ 适用于需要可解释性强的企业级应用[^2]。 ### 二、分布式任务调度框架 3. **Ray** 采用分布式自底向上调度策略,通过@ray.remote装饰器实现并行计算。例如: ```python @ray.remote def process_data(batch): return llm.generate(batch) ``` 适用于需要横向扩展的LLM推理场景[^1]。 4. **Dask** 通过集中式调度器优化计算资源分配,提供类似Pandas的API接口,适合处理内存不足的大型数据集。 ### 三、模块化AI组件库 5. **Dust** 提供可视化工作流设计界面和版本控制功能,支持通过JSON配置实现多模型协作,例如: ```json {"steps": [{"model": "gpt-4", "prompt": "{{input}}"}]} ``` 6. **Semantic Kernel** 微软开发的跨语言框架(支持C#/Python),提供规划器(Planner)和技能(Skill)抽象层,可通过$skill\_graph = \text{SkillLoader.load\_directory}()$动态加载功能模块。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值