专业的JAVA编程教程与资源

网站首页 > java教程 正文

Java的BigDecimal踩坑了!精度丢失~

temp10 2024-10-11 18:29:06 java教程 16 ℃ 0 评论

BigDecimal:4.0-3.3 不等于 0.7,坑麻了!

4.0 减去 3.3 竟然不等于 0.7,这个 BigDecimal 也太离谱了!

Java的BigDecimal踩坑了!精度丢失~

先来看一段代码,直接通过浮点数 new 出来两个 BigDecimal,然后用大的减去小的去跟 0.7 进行比较,看它是不是等于 0.7,也就是说 4.0 减去 3.3 是不是等于 0.7。

大家觉得这个结果是什么?应该是 true,然而事实并不是这样。

我先打个断点,然后到这里来运行一下,直接给它运行完,看它输出的结果是什么?它输出的是 false,也就是说这个是 false,4.0 减去 3.3 不等于 0.7,真是绝了!

那么这个 c 到底是什么?它为什么不等于 0.7?看 c 打出来之后,这个玩意是 0.7,但是后边有一些小数,它并不是一个整的 0.7。然后这个 d 也是这个样子的,我这边是直接通过 0.7 进行构造的,但是它构造出来的时候竟然是这个玩意儿 0.699,这也太绝了!

这应该怎么解决?实际上这个 idea 已经给我们提示出来了,你看是这个样子的,就是不要通过直接 new 浮点数去构建出 BigDecimal 来,应该通过字符串去构建,因为通过浮点数给构建的时候就会损失精度。

看来写代码的时候要好好注意一下 idea 的提示,现在就把它给改一改,这个样子,都把它改成为它提示的那一种,就是用字符串。这个时候大家觉得这个能不能是 true 了?这个能是精确的 0.7 吗?这个能是精确的 0.7 吗?现在直接来运行一下,就不打断点了,现在就是对的了,完全的相等,然后把它们打印出来,也是一个整的 0.7。

这就是 BigDecimal 的一个重要的注意事项。其实 BigDecimal 还有很多重要的注意事项,比如说在进行除法运算的时候,要指定它的小数位数,不然如果有无限小数就会直接报错。这个 BigDecimal 确实是个很好用的东西,但是实际使用的时候一定要注意,不然就要翻车了。

咱们下期视频再见拜拜。

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表