当前位置: 首页 > news >正文

bigdecimal不保留小数_深入理解 BigDecimal

关注公众号:小李不秃

什么是 BigDecimal

BigDecimal 可以表示一个任意大小且精度完全准确的浮点数。

为什么用 BigDecimal 而不用 double

Talk is cheap, Show me the Code.

例 1:

double 

运行结果

Double:  

从运行结果可以得出,当我们要做精确的小数操作运算时,就需要用到 BigDecimal。那下面做一下除法运算,看看结果:

例 2:

double 

运行结果

Double:  

当结果除不进,并且没有设置进位的状态值,那就会抛出异常。正确的操作如下:

System

运行结果

Double:  

总结:当我们在精度要求非常高的时候,需要进行精确的计算,比如:货币,那我们就需要采用 java.math.BigDecimal 类来进行精确计算。

加减乘除

d1b2143fa5409a0964587b8996973b2b.png
public 

运行结果:

a 

常用方法

保留两位小数

public 

四舍五入

  • ROUND_UP

舍入远离零的舍入模式。

在丢弃非零部分之前始终增加数字(始终对非零舍弃部分前面的数字加 1)

例如:2.36 -> 2.4

  • ROUND_DOWN

接近零的舍入模式。

在丢弃某部分之前始终不增加数字(从不对舍弃部分前面的数字加1,即截短)。

例如:2.36 -> 2.3

  • ROUND_CEILING

接近正无穷大的舍入模式。

如果 BigDecimal 为正,则舍入行为与 ROUND_UP 相同;

如果为负,则舍入行为与 ROUND_DOWN 相同。

相当于是 ROUND_UPROUND_DOWN 的合集

  • ROUND_FLOOR

接近负无穷大的舍入模式。

如果 BigDecimal 为正,则舍入行为与 ROUND_DOWN 相同;

如果为负,则舍入行为与 ROUND_UP 相同。

ROUND_CEILING 正好相反

  • ROUND_HALF_UP

四舍五入

例如:2.35 -> 2.4

  • ROUND_HALF_DOWN

五舍六入

例如:2.35 -> 2.3

  • ROUND_HALF_EVEN

如果舍弃部分左边的数字为奇数,则舍入行为与 ROUND_HALF_UP 相同(四舍五入);

如果为偶数,则舍入行为与 ROUND_HALF_DOWN 相同(五舍六入)。

例如:1.15 -> 1.1,1.25 -> 1.2

  • ROUND_UNNECESSARY

断言请求的操作具有精确的结果,因此不需要舍入。

如果对获得精确结果的操作指定此舍入模式,则抛出 ArithmeticException。

我觉得剩下得了解下就行,而且我感觉剩下有的就是错的,比如 ROUND_HALF_DOWNROUND_HALF_EVEN,看下面的结果你就知道我说的是为什么了。

public 

运行结果

ROUND_UP,结果:2.4
ROUND_DOWN,结果:2.3
ROUND_CEILING,结果:2.4
ROUND_FLOOR,结果:2.3
ROUND_HALF_UP,结果:2.4
ROUND_HALF_DOWN,结果:2.4 (来给我解释解释这个,说好的五舍六入呢)
ROUND_HALF_EVEN,结果:2.4 (还有这个)
Disconnected from the target VM, address: '127.0.0.1:59637', transport: 'socket'
Exception in thread "main" java.lang.ArithmeticException: Rounding necessary

小结:常用的就是 ROUND_HALF_UPROUND_UPROUND_DOWN,其它的当个笑话就行

比较

a.compareTo(b)

a > b 返回 1;a = b 返回 0;a < b 返回 -1

public 

运行结果

a 

注意事项

在上面的使用中,我们都用的 String 给 BigDecimal 进行 赋值,而没有使用 double 类型赋值,具体的原因看下面的例子:

public 

运行结果:

加法用value结果:1000000.005000000000000000104083408558608425664715468883514404296875
加法用string结果:1000000.005
减法value结果:-999999.994999999999999999895916591441391574335284531116485595703125
减法用string结果:-999999.995
乘法用value结果:5000.000000000000104083408558608425664715468883514404296875000000
乘法用string结果:5000.000
绝对值用value结果:1000000
绝对值用string结果:1000000
除法用value结果:199999999.99999999583666365766
除法用string结果:200000000.00000000000000000000
  • System.out.println() 中的数字默认是 double 类型的,double 类型的小数计算不准确
  • 使用 BigDecimal 的构造方法传入 double 类型时,计算的结果也是不准确的!

所以我们在使用 BigDecimal 进行赋值的时候,最好使用传入 String 的构造函数,可以确认精度。

参考

https://blog.csdn.net/haiyinshushe/article/details/82721234

https://www.jianshu.com/p/2947868d76eb

https://blog.csdn.net/ochangwen/article/details/51531866

相关文章:

  • mysql 去重复查询_MySQL事务隔离级别和实现原理(看这一篇文章就够了!)
  • matlab追赶法解三对角方程组_高斯消元法解线性方程组
  • case when then else_第6章 函数、谓词、CASE表达式及练习题
  • git add 撤销_Git中的各种后悔药
  • python 爬取实时数据django显示_django+echart数据动态显示的例子
  • python获取安卓手机的屏幕_[Python]从安卓手机获取屏幕截图
  • rust编程之道 pdf_哪种编程语言又快又省电?有人对比了27种语言
  • python判断一个元素是否在列表中_python判断元素在列表中是否存在
  • python中的可视化工具_Python中常用的可视化工具 Matplotlib 简单入门
  • it项目经理带一个项目的完整_项目经理,一个完整的项目管理流程你做对了吗?...
  • dll 调用exe_盘点RUNDLL32.EXE的多种滥用方式及检测特征
  • python安装launcher要选吗_python的launcher用法知识点总结
  • 怎么用geany配置python_Geany中怎么配置python?
  • python判断按键是否按下_python怎样判断字典中的键是否存在
  • elasticsearch_Spring Boot 整合 Elasticsearch
  • Java 多线程编程之:notify 和 wait 用法
  • Java 网络编程(2):UDP 的使用
  • Octave 入门
  • vue-cli3搭建项目
  • 从0搭建SpringBoot的HelloWorld -- Java版本
  • 讲清楚之javascript作用域
  • 离散点最小(凸)包围边界查找
  • 每天10道Java面试题,跟我走,offer有!
  • 使用 Docker 部署 Spring Boot项目
  • 适配iPhoneX、iPhoneXs、iPhoneXs Max、iPhoneXr 屏幕尺寸及安全区域
  • 手写一个CommonJS打包工具(一)
  • 白色的风信子
  • 1.Ext JS 建立web开发工程
  • Nginx惊现漏洞 百万网站面临“拖库”风险
  • 阿里云服务器购买完整流程
  • #控制台大学课堂点名问题_课堂随机点名
  • $emit传递多个参数_PPC和MIPS指令集下二进制代码中函数参数个数的识别方法
  • (a /b)*c的值
  • (Redis使用系列) Springboot 实现Redis 同数据源动态切换db 八
  • (安全基本功)磁盘MBR,分区表,活动分区,引导扇区。。。详解与区别
  • (定时器/计数器)中断系统(详解与使用)
  • (二开)Flink 修改源码拓展 SQL 语法
  • (亲测)设​置​m​y​e​c​l​i​p​s​e​打​开​默​认​工​作​空​间...
  • (一)VirtualBox安装增强功能
  • (转) Face-Resources
  • (转)创业家杂志:UCWEB天使第一步
  • * 论文笔记 【Wide Deep Learning for Recommender Systems】
  • .360、.halo勒索病毒的最新威胁:如何恢复您的数据?
  • .form文件_一篇文章学会文件上传
  • .NET Core 成都线下面基会拉开序幕
  • .net 调用php,php 调用.net com组件 --
  • .NET牛人应该知道些什么(2):中级.NET开发人员
  • @EventListener注解使用说明
  • @kafkalistener消费不到消息_消息队列对战之RabbitMq 大战 kafka
  • @ModelAttribute 注解
  • [ C++ ] STL_list 使用及其模拟实现
  • [bzoj 3124][sdoi 2013 省选] 直径
  • [CLR via C#]11. 事件
  • [c语言]小课堂 day2
  • [echarts] y轴不显示0