java-BigDecimal 的使用

总结 BigDecimal是Java中的一个强大工具,用于处理高精度的数值计算,特别是在财务和科学计算中。它通过提供对精度和舍入行为的精细控制,解决了浮点数运算中的精度问题。以下是对BigDecimal的进一步总结和扩展。

9. BigDecimal的使用示例

9.1 基本运算

以下是BigDecimal进行基本运算的示例,包括加、减、乘、除。

import java.math.BigDecimal;
import java.math.RoundingMode;public class BigDecimalExample {public static void main(String[] args) {BigDecimal bd1 = new BigDecimal("123.456");BigDecimal bd2 = new BigDecimal("654.321");// 加法BigDecimal sum = bd1.add(bd2);System.out.println("Sum: " + sum); // 输出:Sum: 777.777// 减法BigDecimal difference = bd2.subtract(bd1);System.out.println("Difference: " + difference); // 输出:Difference: 530.865// 乘法BigDecimal product = bd1.multiply(new BigDecimal("2"));System.out.println("Product: " + product); // 输出:Product: 246.912// 除法BigDecimal quotient = bd1.divide(new BigDecimal("2"), 3, RoundingMode.HALF_UP);System.out.println("Quotient: " + quotient); // 输出:Quotient: 61.728}
}
9.2 比较大小

使用compareTo方法比较两个BigDecimal对象的大小。

public class BigDecimalComparison {public static void main(String[] args) {BigDecimal bd1 = new BigDecimal("123.456");BigDecimal bd2 = new BigDecimal("123.456");BigDecimal bd3 = new BigDecimal("654.321");// 比较大小System.out.println("bd1.compareTo(bd2): " + bd1.compareTo(bd2)); // 输出:0System.out.println("bd1.compareTo(bd3): " + bd1.compareTo(bd3)); // 输出:-1System.out.println("bd3.compareTo(bd1): " + bd3.compareTo(bd1)); // 输出:1}
}
9.3 精度和舍入

设置BigDecimal的精度和舍入模式,确保计算结果符合预期。

public class BigDecimalRounding {public static void main(String[] args) {BigDecimal bd = new BigDecimal("123.456789");BigDecimal roundedUp = bd.setScale(2, RoundingMode.UP);BigDecimal roundedDown = bd.setScale(2, RoundingMode.DOWN);BigDecimal roundedHalfUp = bd.setScale(2, RoundingMode.HALF_UP);System.out.println("Rounded UP: " + roundedUp); // 输出:123.46System.out.println("Rounded DOWN: " + roundedDown); // 输出:123.45System.out.println("Rounded HALF_UP: " + roundedHalfUp); // 输出:123.46}
}

10. 深入理解BigDecimal的内部工作原理

10.1 内部表示

BigDecimal使用BigInteger表示数值的整数部分,并通过scale字段表示小数点的位置。这种表示方法允许BigDecimal处理非常大的或非常小的数值,同时保持高精度。

public class BigDecimalInternal {public static void main(String[] args) {BigDecimal bd = new BigDecimal("123.456");System.out.println("Value: " + bd.unscaledValue()); // 输出:123456System.out.println("Scale: " + bd.scale()); // 输出:3}
}
10.2 不变性

BigDecimal是不可变类,这意味着每次对其进行操作都会返回一个新的BigDecimal对象。这样设计的好处是可以避免多线程环境下的数据竞争问题。

public class BigDecimalImmutability {public static void main(String[] args) {BigDecimal bd1 = new BigDecimal("123.456");BigDecimal bd2 = bd1.add(new BigDecimal("1.0"));System.out.println("Original: " + bd1); // 输出:123.456System.out.println("New: " + bd2); // 输出:124.456}
}

11. 实际应用中的BigDecimal

11.1 财务计算

在财务计算中,使用BigDecimal可以避免浮点数精度问题,确保计算结果的准确性。

public class FinancialCalculation {public static void main(String[] args) {BigDecimal principal = new BigDecimal("1000.00");BigDecimal rate = new BigDecimal("0.05");BigDecimal interest = principal.multiply(rate).setScale(2, RoundingMode.HALF_UP);System.out.println("Interest: " + interest); // 输出:Interest: 50.00}
}
11.2 科学计算

BigDecimal适用于需要高精度的科学计算,如计算圆的面积等。

public class ScientificCalculation {public static void main(String[] args) {BigDecimal radius = new BigDecimal("2.5");BigDecimal pi = new BigDecimal("3.14159265358979323846");BigDecimal area = pi.multiply(radius.pow(2)).setScale(10, RoundingMode.HALF_UP);System.out.println("Area: " + area); // 输出:Area: 19.6349540849}
}

12. 性能优化和注意事项

12.1 避免使用double构造器

尽量避免使用double构造器来创建BigDecimal对象,因为这可能会导致精度丢失。推荐使用String构造器。

BigDecimal bd1 = new BigDecimal("123.456");
BigDecimal bd2 = new BigDecimal(123.456);
System.out.println(bd1); // 输出:123.456
System.out.println(bd2); // 输出:123.4560000000000030695446184836328029632568359375
12.2 预先确定精度和舍入模式

在进行除法和其他需要舍入的操作时,始终预先确定精度和舍入模式,以避免ArithmeticException

BigDecimal bd1 = new BigDecimal("123.456");
BigDecimal bd2 = new BigDecimal("3");
BigDecimal result = bd1.divide(bd2, 2, RoundingMode.HALF_UP);
System.out.println(result); // 输出:41.15

13. 总结

BigDecimal是Java中的一个强大工具,用于处理高精度的数值计算。它提供了精确的控制和广泛的方法来操作数值,特别适用于金融和科学计算中需要高精度的场景。

通过理解BigDecimal的基本使用方法、内部工作原理和常见应用场景,开发者可以更好地利用它来进行高精度计算。同时,注意性能优化和避免常见的陷阱,可以确保代码的高效和可靠性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/31489.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

kafka的基本模型

kafka官网 线程和线程之间的数据交互 在jvm里不同的线程有自己的栈内存,但彼此之间交互可以在共享的内存中进行,即堆内存,堆内存会将这些消息放到队列中,具体实现jvm见,栈内存各自维护,堆内存大家共享 进…

微信小程序UI组件库合集

文章目录 前言参考地址推荐组件库1.官方WeUI(建议使用☆☆☆☆)2.ColorUI(广告很多,不建议使用)3.vantUI又名:ZanUI(操作简单,建议使用☆☆☆☆)4.MinUI(比较…

STM32---SPI通信协议(小白入、含源码)

写在前面:在单片机的学习过程中,各种通信协议的学习是必不可少的,在前面我们学习了串口通信、IIC通信,本节我们来认识一下SPI通信协议。包括其SPI基本概念、NORFLASH芯片的介绍以及相关的例程实验。 目录 一、SPI介绍 1.1什么是…

Python 用相对名称来导入包中的子模块

文章目录 需求方案讨论绝对路径缺点 注意事项相对路径导入不能跳出定义包的目录在 Python 中,位于脚本顶层目录的模块(即直接运行的脚本)不能使用相对导入。 需求 我们将代码组织成了一个包,想从其中一个子模块中导入另一个子模块…

【小白专用24.6.18】C# SqlSugar:连接数据库实现简单的,增、删、改、查

【小白专用 已验证24.6.18】C# SqlSugar操作MySQL数据库实现增删改查-CSDN博客 通过NuGet包管理器搜索SqlSugar(MySql还要安装MySql.Data、Newtonsoft.Json)包并安装 SqlSugarClient db new SqlSugarClient(new ConnectionConfig(){ConnectionString …

中国信通院专访镜舟科技:开源商业化走了多远?

据《2023 中国开源发展蓝皮书》显示,随着数字化转型的深入,开源生态在去年快速发展,开源商业化的模式也逐渐成型。镜舟科技作为开源商业化的先行者,也在技术创新和商业拓展中稳步增长。 日前,中国信息通信研究院&…

Python基础教程(二十八):pip模块

💝💝💝首先,欢迎各位来到我的博客,很高兴能够在这里和您见面!希望您在这里不仅可以有所收获,同时也能感受到一份轻松欢乐的氛围,祝你生活愉快! 💝&#x1f49…

【深度学习】TensorRT模型转换环境

Ubuntu 22.04 LTS、Cuda 12.3、Tensorrt 8.6.1、Python 3.10、A10G GPU 要在 Ubuntu 22.04 LTS 上使用 TensorRT 将模型转换为 TensorRT 格式,您需要安装一些必要的环境和依赖项。以下是详细的步骤: 更新系统: sudo apt update sudo apt upg…

NGINX_十二 nginx 地址重写 rewrite

十二 nginx 地址重写 rewrite 1 什么是Rewrite Rewrite对称URL Rewrite,即URL重写,就是把传入Web的请求重定向到其他URL的过程。URL Rewrite最常见的应用是URL伪静态化,是将动态页面显示为静态页面方式的一种技术。比如 http://www.123.com…

MVVM模式理解(基于Qt分析)

MVVM(Model-View-ViewModel)软件框架可以有效分离用户界面和业务逻辑,提升代码的可维护性和可测试性。下面我们简要的实现一个MVVM框架示例,并说明其特点和优势。 框架结构 Model(模型):负责数…

【Ubuntu开发入门之“悟空派wukongpi/香橙派orangepi H3 linux开发③kernel移植调试“】

Ubuntu开发入门之"悟空派wukongpi/香橙派orangepi H3 linux开发③kernel移植调试 问题描述解决方法获取源码内核适配和编译制作TF卡分区,以备存放各个分区和文件根文件系统拷贝郑重声明:本人原创博文,都是实战,均经过实际项目验证出货的 转载请标明出处:攻城狮2015 Pla…

2024097期传足14场胜负前瞻

2024097期售止时间为6月22日(周六)20点30分,敬请留意: 本期14场由欧洲杯、美洲杯、美职联组成,1.5以下赔率2场,1.5-2.0赔率10场,其他场次是平半盘、平盘。本期14场难度中等。以下为基础盘前瞻&a…

【JavaScript脚本宇宙】驾驭异步:探索六种流行响应式编程库

掌握数据流的艺术:六种响应式编程库全面比较 前言 本文将对几种流行的JavaScript数据流库进行比较,包括RxJS、Bacon.js、Kefir.js、Most.js、xstream和Highland.js。每种库都有独特的特点和优势,适用于不同的场景。通过了解这些库的功能、使…

涉密文件当废品卖,涉密文件如何安全便捷销毁?

前几天,一位大爷在废品收购站买到四本涉及军事的涉密文件登上热搜,此事源于相关工作人员没有按照涉密文件销毁流程,缺乏保密意识,将200余本涉密资料当做废品出售,导致涉密信息在外部曝光。 无论是在企业内部还是在机关…

合并两个可能为空的List 的方法记录

在日常开发中,我们经常需要将两个列表(List)合并成一个新的列表。这个任务看似简单,但如果其中一个或两个列表可能为 null,处理起来就需要注意一些细节。本文将介绍一种使用 Java 8 Stream API 的简洁方法来完成这一任…

【APP移动端性能测试】第三节.性能测试工具GT和常见的性能测试点(上)

文章目录 前言一、性能测试工具GT 1.1 性能测试工具GT的基本介绍 1.2 性能测试工具GT的基本使用二、CPU性能测试 2.1 CPU说明 2.2 CPU测试步骤 2.3 监控结果保存到目录文件三、内存性能测试 3.1 内存知识点介绍 3.2 常见的内存问题和现象 …

docker将容器打包提交为镜像,再打包成tar包

将容器打包成镜像可以通过以下步骤来实现。这里以 Docker 为例,假设你已经安装了 Docker 并且有一个正在运行的容器。 1. 找到正在运行的容器 首先,你需要找到你想要打包成镜像的容器的 ID 或者名字。可以使用以下命令查看所有正在运行的容器&#xff…

【0-1系列】从0-1快速了解搜索引擎是什么以及怎么用(上)

友情链接 社区开发版安装部署与使用教程社区版家族V2024.5版本更新说明 START>>1.快速了解搜索引擎 什么是搜索引擎数据库 搜索引擎数据库是一类专门用于数据内容搜索的NoSQL数据库,是非结构化大数据处理分析领域中重要的基础支撑软件。 伴随互联网、移动…

DSP应用市场的大蛋糕,国产厂商能吃下多少?

DSP是数字信号处理器(Digital Signal Processor)的简称,是一种专门用于高速数学运算的微处理器。DSP能够快速且准确地处理数字信号,同时具备可编程和低功耗等特点,如今在各个领域发挥着越来越重要的作用。 &#xff08…

【目标检测】图解 DETR 系统框图

简略版本 Backbone:CNN backbone 学习图像的 2D 特征Positional Encoding:将 2D 特征展平,并对其使用位置编码(positional encoding)Encoder:经过 Transformer 的 encoderDecoder:encoder 的输出…