一、关于public BigDecimal(double val)

BigDecimal中三个主要的构造函数

1

public BigDecimal(double val)

将double表示形式转换为BigDecimal

不推荐

2

public BigDecimal(int val)

将int表示形式转换为BigDecimal

推荐

3

public BigDecimal(String val)

将字符串表示形式转换为BigDecimal

推荐

不推荐用 BigDecimal(double val)的原因是因为存在精度问题,如下图:

如果要探究造成这个问题的原因其实和BigDecimal没有关系;

原因:这其实和计算机使用二进制编码有关,在你使用BigDecimal(Double val)传入0.1时,这个0.1先被转换为Double,此时就已经出现了精度问题了,计算机只能用有限位数存储小数【二进制能用有限的位数表示的小数有:0.5、0.25、0.125 等】,所以存储的小数大多为一个近似值,十进制的 0.1 转为二进制,得到一个无限循环小数,所以传入到BigDecimal(Double val)中的数精度已经出现问题了,而BigDecimal又是为精确结果而设计的,所以bDouble就不是我们想要的0.1。

如何解决:

一、使用BigDecimal b1 = new BigDecimal("0.1");将数据转成String再使用BigDecimal(String val);

二、使用BigDecimal b1 = BigDecimal.valueOf(0.1);使用BigDecimal的valueOf()方法;

打开BigDecimal的valueOf()的源码

可以看到它也是直接转成String类型再调用BigDecimal(String val);方法

二、关于Non-terminating decimal expansion; no exact representable decimal result

Non-terminating decimal expansion; no exact representable decimal result.  翻译为:非终止十进制扩展; 没有确切的可表示的小数结果;

翻译为人话就是说:BigDecimal是为高精度计算而设计的,而你的值是没有精确结果的;

举例:

1.0/3.0是除不尽的,所以抛出异常

解决方案:使用BigDecimal.divide(BigDecimal divisor, int scale, RoundingMode roundingMode) ;

其中   scale  为保留的小数位;RoundingMode roundingMode 为取舍模式(如:RoundingMode.HALF_UP 四舍五入);

RoundingMode具有哪些模式请参照我的另一篇博客:https://www.cnblogs.com/minxl/p/10247770.html

BigDecimal中要注意的一些事的更多相关文章

  1. Spring中你可能不知道的事(一)

    Spring作为Java的王牌开源项目,相信大家都用过,但是可能大家仅仅用到了Spring最常用的功能,Spring实在是庞大了,很多功能可能一辈子都不会用到,今天我就罗列下Spring中你可能不知道 ...

  2. C标准中关于空指针的那些事

    1 C标准不保证用所有二进制位都为0的变量来表示空指针,但它保证空指针与任何对象或函数的指针都不相等,取地址操作符&永远也不会返回空指针: 2 C标准称在指针上下文中的"值为0的整形 ...

  3. BigDecimal 中 关于RoundingMode介绍

    RoundingMode介绍 RoundingMode是一个枚举类,有以下几个常量:UP.DOWN.CEILING.FLOOR.HALF_UP.HALF_DOWN.HALF_EVEN.UNNECESS ...

  4. 爬虫中网络请求的那些事之urllib库

    目录 爬虫之网络请求中的那些事 urllib库 urlopen函数 urlretrieve函数 urlencode.parse_qs函数 urlparse.urlsplit函数: request.Re ...

  5. 关于javascript中this的那点事

    this可谓是JavaScript中的开发神器,使用得当的话不仅有事半功倍的效果,而且代码的逼格也更高.但是既然是神器,如果你没有足够的功力的话,那么就不要使用它,否则就有可能自毁身亡.曾几何时,我偶 ...

  6. laravel 中 与前端的一些事5 之解决缓存问题:version

    Version的主要目的就是解决浏览器的缓存问题,在这个方面,Elixir给出的解决方案很完美 应用场景:当我们的css或者js重新更新了,我们需要告诉浏览器我们不要缓存的css或js静态文件样式时, ...

  7. laravel 中 与前端的一些事1

    首先安装node.js 在命令行中敲node -v 可以查看node的版本信息 还需要安装npm,相当于php中的composer node.js中5.0版本后的都已经将npm打包进node了 还要安 ...

  8. android中setOnClickListener的那点事

    最近在写代码中,发现在xml文件设置了android:clickable="false",之后这个View还是可点的. 后来发现,是代码中对View设置了监听事件(setOnCli ...

  9. 聊聊iOS开发中耳机的那点事(监听耳机拔插、耳机线控)-b

    如果说一个项目出现的最重大的事故,那无疑就是开发人员使用了不可控的元素. 前言 iOS开发当中有关于视音频播放的开发不在少数,用户时常会使用到一种输出设备,那就是"耳机",这一篇博 ...

随机推荐

  1. kafka删除topic中的数据,适用于比较高的版本

    server.properties中增加选项 delete.topic.enable=true 修改之后重启kafka 进入kafka目录,输入命令 bin/kafka-topics.sh --zoo ...

  2. C# 合并两个数组总结

    byte[] b1 = new byte[] { 1, 2, 3, 4, 5 }; byte[] b2 = new byte[] { 6, 7, 8, 9 }; byte[] b3 = new byt ...

  3. Part 20 Create custom service in AngularJS

    Whenever the case changes from lower to upper, a single space character should be inserted. This mea ...

  4. Python 常见运算符表达式

    常见运算符表达式    1.算数运算符    2.逻辑运算符    3.比较运算符    4.成员运算符    5.位运算符    6.身份运算符a.赋值运算符 =    格式:变量= 表达式     ...

  5. [loj2265]最长上升子序列

    以下内容参考2019年集训队论文<浅谈杨氏矩阵在信息学竞赛中的应用> 1.前置知识 杨表 标准杨表:一张网格图,满足以下条件-- 1.设其有$m$行.第$i$行有$a_{i}$个格子(格子 ...

  6. [luogu5537]系统设计

    考虑哈希,令$h[x]$表示根到$x$路径的哈希值,那么有$h[x]+hash(l,r)=h[ans]$ 考虑用线段树维护$a_{i}$的区间哈希值,并用map去找到对应的$ans$ 但还有一个问题, ...

  7. [JSC2021 A~D + F]

    半小时打完了\(A~D\),想要一发\(F\)冲进前\(100\),结果平衡树常数大\(T\)了.据说\(G\)是矩阵树定. \(A\) 放代码吧. A // code by Dix_ #includ ...

  8. Codeforces 1422F - Boring Queries(树套树)

    upd on 2021.9.5:昨天的那个版本被 2-tower 卡爆了,故今天重发一个. Codeforces 题面传送门 & 洛谷题面传送门 没往"每个数最多只有一个 \(> ...

  9. Codeforces 1476G - Minimum Difference(带修莫队+根号平衡)

    Codeforces 题目传送门 & 洛谷题目传送门 震惊!我竟然独立切掉了这道 *3100 的题! 虽然此题难度的确虚高,感觉真实评分也就 2800~2900 罢.但感觉还是挺有成就感的( ...

  10. 解决 Ubuntu 下 gedit编辑器打开文件出现中文乱码问题

    解决 Ubuntu 中 gedit编辑器打开文件出现中文乱码问题 1. 问题分析 在 windows 系统下,.txt 文件默认编码方式为 gb18030 格式的中文编码,而 gedit 默认的编码方 ...