1.什么是BigDecimal

之前我们用到的double和float都可以处理16位的有效数字,然而多数运用于工程中,要求不需要很精确,但是在商业中需要精准运算,因此Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。在做精确运算时,我们不能使用传统的算术运算符直接对其对象进行数学运算,而必须调用其相对应的方法。

2.采用浮点运算存在的一些问题

System.out.println(0.2 + 0.1);
输出结果为:

主要原因就是计算机中所有的数字都是二进制表示的,但是浮点数没有办法完全用二进制表示,用二进制表示浮点数会损失一定的精度,就像上面0.1用二进制表示时是无限接近于0.1,就变成了0.2+0.1000000000004。

3.BigDecimal构造器

BigDecimal(int) 创建一个具有参数所指定整数值的对象。

BigDecimal(double) 创建一个具有参数所指定双精度值的对象。(不建议采用)

BigDecimal(String) 创建一个具有参数所指定以字符串表示的数值的对象 。

在2中已经说到采用浮点类型表示一个数会存在精度丢失,因此用的·第二种构造方法时也会存在精度丢失问题。所以通常建议第三种构造方法。

 4.常用方法

4.1 数学运算

public BigDecimal add(BigDecimal value);                     public BigDecimal subtract(BigDecimal value);                   public BigDecimal multiply(BigDecimal value);              public BigDecimal divide(BigDecimal value);                

四个方法分别对应数学运算中的加减乘除,使用时需要通过一个BigDecimal对象来调用方法。

4.2 截断和四舍五入

public static void main(String[] args){BigDecimal a = new BigDecimal("2.1111111");a = a.setScale(4, RoundingMode.HALF_UP);    //保留后4位,并且四舍五入System.out.println(a);}

注:以上运算生成的结果是一个新的BigDecimal类型,类似于String不可变。

4.3 实际使用

在开发微信支付的时候设置转账金额都是用BigDecimal

void create(String orderId, BigDecimal amount);

当创建一个订单时:

 payService.create("324132462643", BigDecimal.valueOf(0.01));

这里使用的构造器就是先将double型转变为string。类似于:

new BigDecimal("0.01");

java中的BigDecimal类型相关推荐

  1. Java中使用BigDecimal类型比较大小

    BigDecimal使用心得 BigDecimal使用场景 为什么要用BigDecimal 用BigDecimal的compareTo方法做大小判断 BigDecimal使用场景 BigDecimal ...

  2. Java中的BigDecimal类你真的了解吗?

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 作者:HikariCP www.jianshu.com/p/c81 ...

  3. Java 中的 BigDecimal,你真的会用吗?

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | LanceToBigData 来源 | cnb ...

  4. Java 中的 BigDecimal 类你了解多少?

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:什么?你还在使用fastjson,性能太差了个人原创+1博客:点击前往,查看更多 作者:HikariCP 链接: ...

  5. 后端:Java中的BigDecimal类你了解多少?

    我们都知道浮点型变量在进行计算的时候会出现丢失精度的问题.如下一段代码: System.out.println(0.05 + 0.01); System.out.println(1.0 - 0.42) ...

  6. Java中的BigDecimal,你真的会用吗?

    点击上方 "程序员小乐"关注, 星标或置顶一起成长 每天凌晨00点00分, 第一时间与你相约 每日英文 Forgetting someone doesn't mean never ...

  7. Java中的BigDecimal类你了解多少?

    点击上方"IT牧场",选择"设为星标"技术干货每日送达! 来源:https://urlify.cn/naiEva 前言 我们都知道浮点型变量在进行计算的时候会出 ...

  8. Java中,一切皆是对象——java中的对象类型与基本数据类型的区别

    起因:取一个list给另一个list赋值,然后在另一个list中取出进行修改.list其中类型为对象时,String时,基本数据类型时. [java中的对象类型与基本数据类型的区别] #声明和实例化 ...

  9. java中的null类型---有关null的9件事

    摘自 https://blog.csdn.net/qq_25077777/article/details/80174763 今天听到一个问题,java中的null类型,null竟然是一种类型 java ...

  10. byte java byte_详解java中的byte类型

    Java中整数类型有:byte占8位, short 占16位, int占32位, long占64位 Java也提供了一个byte数据类型,并且是基本类型中的整数类型.java byte是作为最小的数字 ...

最新文章

  1. 上传图片,要求图片200100象素,大小小于2M
  2. 比尔盖茨聘请投资高手,26年亏掉4300亿美金!
  3. x3m文件怎么转换成mp3_视频中的音频怎么单独提取出来转换成mp3格式
  4. java明文发送_使用java MD5加密网络明文
  5. 2022年中国足球球迷行为洞察白皮书
  6. MSSQL中使用CASE函数来灵活返回结果
  7. mybatis如何防止sql注入
  8. FFMPEG基于内存的转码实例——输入输出视频均在内存
  9. (转)python3 安装 BeautifulSoup 提示 Unit tests have failed!
  10. 不会写Java面试简历?看这一篇就够了(项目经历,个人技能)
  11. TextBlock/Textbox
  12. 图解大数据 | 大数据生态与应用导论
  13. 按键精灵 手机 oracle,按键精灵Android版:软件使用
  14. win10重置计算机网络设置,为你解答win10下如何重置网络
  15. Java学习路线:day1 Java语言概述
  16. mongoose 之Shema
  17. 实验二——————路由器口令配置
  18. 剖析cmwap和cmnet接入点区别和应用
  19. 65页PPT|数字化转型中的大数据治理如何落地
  20. 【云原生之Docker实战】使用Docker部署Rap2开源接口管理工具

热门文章

  1. 数学四大思想八大方法_数学四大思想方法
  2. bp神经网络反向传播推导,bp神经网络的传递函数
  3. Python-GUI界面设计(tkinter)
  4. hp/博科光纤交换机配置小记
  5. 基于html的美食网站——速鲜站餐饮食品(HTML+CSS+JavaScript)大学生网页制作教程 表格布局网页模板 学生HTML静态美食网页设计作业成品 简单网页制作代码 学生美食网页作品
  6. 记录mikrotik路由器的折腾过程
  7. win10怎么查看计算机用户名和密码,技术员详解win10系统查看电脑密码的详细方案...
  8. 应该怎样读TAOCP
  9. JavaScript在线解压 ZIP 文件 JavaScript 怎样在线解压 ZIP,jszip实现解压压缩包,并下载压缩包内文件
  10. C语言程序设计--新生入学登记系统