又是学习java的一天,好开心哎嘿

文章目录

  • 前言
  • BigDecimal是啥??
  • BigDecimal的缺点
  • BigDecimal的数值比较
  • BigDecimal的封装
  • 总结

前言

在开发中,数值计算过程中,不管前端还是后端,都会出现精度丢失的情况,例如:0.1+0.2 !== 0.3的情况,那么在java中怎么去解决这个问题?

BigDecimal是啥??

BigDecimal对象是java中自带的工具类,直接引入使用即可。示例:

BigDecimal a = new BigDecimal("0.1");
BigDecimal b = new BigDecimal("0.2");
BigDecimal c = a.add(b); // 加法
System.out.println(c); // 0.6
c = a.subtract(b); // 减法
System.out.println(c); // -0.2
c = a.multiply(b); // 乘法
System.out.println(c); // 0.08
c = a.divide(b); // 除法
System.out.println(c); // 0.5

以上就是加减乘除的方法示例

BigDecimal的缺点

  • 它的构造方法和运算方法都需要传入字符串类型的参数,而不是直接传入浮点数(直接传入Number类型的0.1||0.2则为浮点数),否则会有精度丢失的风险。这样就增加了代码的复杂度和不便利性。
  • 它的运算效率比浮点数要低很多,因为它需要处理任意精度的数值。如果不需要精确的结果,而只是做一些统计或比较,使用浮点数会更快。
  • 它是不可变对象,也就是说每次修改它的值都会产生一个新对象。这样就会增加内存的开销和垃圾回收的压力。
  • 它的比较大小和相等操作不方便,不能直接使用=或者>等符号,而要使用compareTo方法。而且不能使用equals方法来判断两个BigDecimal对象是否相等,因为它会同时比较数值和精度。

BigDecimal的数值比较

compareTo方法是用来比较两个BigDecimal对象的大小的。它返回一个int值,表示比较的结果。如果返回值为0,表示两个对象数值相等;如果返回值为负数,表示调用者小于参数;如果返回值为正数,表示调用者大于参数。例如:

BigDecimal a = new BigDecimal("1.23");
BigDecimal b = new BigDecimal("1.23");
BigDecimal c = new BigDecimal("1.24");
System.out.println(a.compareTo(b)); // 0
System.out.println(a.compareTo(c)); // -1
System.out.println(c.compareTo(a)); // 1

BigDecimal的封装

作为一个懒鬼,我是不太喜欢一个一个对象new的,因为在写前端的时候,遇到这种通用的东西我都会封装起来。那么这个玩意儿在java里怎么封装呢?
封装示例:

public class BigDecimalUtil {/*** 加法** @param args 相加数值* @return BigDecimal*/public static BigDecimal add(double... args) {// 如果数组为空或长度为0,返回nullif (args == null || args.length == 0) {return null;}// 定义一个变量,用于存储累加结果BigDecimal result = BigDecimal.ZERO;// 遍历数组,将每个元素转换为BigDecimal对象,并调用add方法进行累加for (double arg : args) {result = result.add(new BigDecimal(String.valueOf(arg)));}// 返回结果return result;}/*** 减法** @param args 相减数值* @return BigDecimal*/public static BigDecimal subtract(double... args) {// 如果数组为空或长度为0,返回nullif (args == null || args.length == 0) {return null;}// 定义一个变量,用于存储累减结果,初始值为第一个元素BigDecimal result = new BigDecimal(String.valueOf(args[0]));// 遍历数组,从第二个元素开始,将每个元素转换为BigDecimal对象,并调用subtract方法进行累减for (int i = 1; i < args.length; i++) {result = result.subtract(new BigDecimal(String.valueOf(args[i])));}// 返回结果return result;}/*** 乘法** @param args 相乘数值* @return BigDecimal*/public static BigDecimal multiply(double... args) {// 如果数组为空或长度为0,返回nullif (args == null || args.length == 0) {return null;}// 定义一个变量,用于存储累乘结果,初始值为第一个元素BigDecimal result = new BigDecimal(String.valueOf(args[0]));// 遍历数组,从第二个元素开始,将每个元素转换为BigDecimal对象,并调用multiply方法进行累乘for (int i = 1; i < args.length; i++) {result = result.multiply(new BigDecimal(String.valueOf(args[i])));}// 返回结果return result;}/*** 除法** @param halfUp* @param args   相除数值* @return BigDecimal*/public static BigDecimal divide(int scale,int roundingMode, double... args) {// 如果数组为空或长度为0,返回nullif (args == null || args.length == 0) {return null;}// 定义一个变量,用于存储累除结果,初始值为第一个元素BigDecimal result = new BigDecimal(String.valueOf(args[0]));// 遍历数组,从第二个元素开始,将每个元素转换为BigDecimal对象,并调用divide方法进行累除,并指定精度和舍入模式for (int i = 1; i < args.length; i++) {result = result.divide(new BigDecimal(String.valueOf(args[i])), scale, roundingMode);}// 返回结果return result;}}
// 使用
System.out.println(BigDecimalUtil.add(1, 2, 3)); // 6
System.out.println(BigDecimalUtil.subtract(5,3,1)); // 1
System.out.println(BigDecimalUtil.multiply(3,6));// 18
System.out.println(BigDecimalUtil.divide(2,BigDecimal.ROUND_DOWN,1,3)); // 0.33
// 四舍五入模式
//BigDecimal.ROUND_DOWN:直接省略多余的小数,比如1.28如果保留1位小数,得到的就是1.2
//BigDecimal.ROUND_UP:直接进位,比如1.21如果保留1位小数,得到的就是1.3
//BigDecimal.ROUND_HALF_UP:四舍五入,2.35保留1位,变成2.4
//BigDecimal.ROUND_HALF_DOWN:四舍五入,2.35保留1位,变成2.3

总结

没啥好总结的,卷死java

前端转java学习之路(一):java高精度计算之bigdecimal相关推荐

  1. java学习之路8——Java集合框架

    一.什么是集合 概念:对象的容器,定义了对多个对象进行操作的常用方法.可以实现数组的功能. 和数组区别: (1)数组长度固定,集合长度不固定 (2)数组可以存储基本类型和引用类型,集合只能存储引用类型 ...

  2. Java学习之路4——Java数组

    教学视频来源链接 一.数组概述 数组是相同类型数据的有序集合. 数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成. 其中,每一个数据称作一个数组元素,每个数组元素可以通过一个下标来访问 ...

  3. 小W的Java学习之路:java基础(四)-数组

    1.为什么要有数组? 数组可以存储相同类型的多个数据,把多个数据放在一个数组中方便使用如果只需要定义一个变量需要数组么?不需要 2.数组的定义 动态初始化:数据类型[] 数组名 = new 数据类型[ ...

  4. java学习之路目录(已完结)

    java学习之路目录(持续更新中-) 第一阶段 javaSE(完结) 序号 标题 内容 001 java初识 java语言特点.体系结构.运行机制 002 java SE基础语法 注释.关键字.变量. ...

  5. Java学习之路1——安装JDK1.8||安装idea2022||Java项目创建【重拾Java】

    Java学习之路1--安装JDK1.8||安装idea2022[重拾Java] 前言 安装 安装JDK1.8 安装idea2022(JetBrains Toolbox) Java项目创建 创建 项目结 ...

  6. 个人开发经历--我的java学习之路(学校篇)

    个人开发经历--我的java学习之路(学校篇) 个人介绍: 姓名: 不在这里说明 联系信息: 个人历程 jdbc阶段 sql生成器 一代代码生成器 servlet阶段 servlet项目中,sql生成 ...

  7. java学习之路2--简单工厂模式实现饮料自动贩卖机

    java学习之路2 用简单工厂模式实现饮料自动贩卖机 功能简介 具体实现 1.简单工厂模式 2.代码 总结 用简单工厂模式实现饮料自动贩卖机) 功能简介 接收用户输入的信息,选择购买的饮料. 可供选择 ...

  8. Java学习之路——接口

    Java学习之路--接口 概述 总所周知,我们是父母的孩子.我们的身上既继承了爸爸的基因也继承了妈妈的基因.这就是多继承. 然而在 Java 程序中,是不支持多继承的.Java 仅仅支持单继承.但是接 ...

  9. 我的Java学习之路2009-11-17

    -------------------------------2009年3月19日开始----------------------------- 下载JDK Myeclipse Netbeans JB ...

  10. JAVA学习之路:不走弯路,就是捷径(一)

      0.引言 在ChinaITLAB导师制辅导中,笔者发现问得最多的问题莫过于"如何学习编程?JAVA该如何学习?".类似的问题回答多了,难免会感觉厌烦,就萌生了写下本文的想法.到 ...

最新文章

  1. java redis缓存理解_Java项目中使用Redis缓存案例
  2. 我的一个特点:数据处理能力还可以,但是数据规律记忆能力有限
  3. mongo3.5 java cursor,Spring Data MongoDB-需要'cursor'选项
  4. js中事件捕获和事件冒泡
  5. linux下DNS服务器的搭建
  6. NLP学习—14.Pointer Generator Network(指针)及代码实现
  7. 你是如何看待 ‘裸辞’ 这件事的?
  8. 俄罗斯方块 java_java 俄罗斯方块
  9. 分贝噪音测试软件文件存储,分贝噪音测试工具
  10. C++ 回调函数简单示例
  11. 狂神说 | Spring完整版笔记
  12. 嵌入式BootLoader技术内幕(一)
  13. Spark核心编程系列(一)——RDD详解
  14. Win10 NVIDIA Container占用CPU高的处理方法
  15. 用手机怎么连接服务器?如何用手机远程连接服务器?
  16. TL-WDN5200H无线usb网卡在ubuntu18.04/16.04上的使用
  17. JavaScript中的二进制搜索算法
  18. 一起来乐邮邮——妙趣小软件:MailMail发布预告
  19. 如何取出某一用户的密码,再原封不动的改回去?
  20. 极企新品发布 缔造办公路由新贵

热门文章

  1. 嵌入式新闻早班车-第16期
  2. Python 选课系统
  3. 完成图书管理系统类图的绘制_自助图书馆应用
  4. Python获取文件的行数和某一行的内容
  5. 液晶显示器电源板工作原理
  6. 小程序兼容苹果底部安全距离
  7. Penalty-Based Multibody Animation(1)
  8. C语言第十二课:编写扫雷游戏(综合练习2)
  9. 广义相加模型(GAM)与向前逐步选择算法(基于R语言)
  10. 写给养花小白的水培小教程