BigDecimal运算
在写老师留的作业的时候(1. 使用for循环计算1+1/2!+1/3!+…+1/20!)本来想用double来直接计算的,但是突然发现精度不够,于是现学了一波BigDecimal,(发现BigDecimal主要用于商业用途em....只做个作业的我应该之后会很少接触了,大概)
这里加个普及吧:Java中float的精度为6-7位有效数字。double的精度为15-16位
一开始就从最基础的初始化开始吧:
我这里就用int,double和string进行转换,结果如下
除了double有些问题外其他的都很正常,先不急,之后我们来看一下运算之后的数值,
现在问题就有些大了,因为double精度的缺失有些严重,所以在进行运算的时候的精度的不准确性就越来越大,至于为什么会这样,就先归功于double的构造方法的结果有一定的不可预知性,而String 构造方法是完全可预知的,但是在正常情况下都会要用double类型的,所以非要用double类型来构造的话,可以使用toString(double)转换
String,然后
使用String构造方法,或使用BigDecimal的静态方法valueOf,如下图:
或者可以写一个工具类。
接下来就是运算——加,减,乘,除,绝对值:
这里特别强调一下除法,因为不能出现整除的情况可能会报错,所以这个时候我看见除法可以有三个参数,所以就上网查了一下,这三个参数分别是干什么的:
sum1.divide(divisor, scale, 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的方向舍入
接下来总结一下:
1.BigDecimal主要用于商业,应该不会再碰到了(大概)。
2.注意一下再用double类型转换时精度会缺失。
3.运算里注意一下除法。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!