• Double计算精度丢失(金融入门知识点)

    • 一.double精度丢失
    • 二.为什么double会精度丢失
    • 三.BigDecimal错误的用法
    • 四.BigDecimal正确的用法

Double计算精度丢失(金融入门知识点)

最近工作发现不少同事对于double精度丢失还不了解,对于一些新手java程序员,这倒是还可以理解,但是如果是已经工作了几年的老鸟,还不清楚,那就要抓紧补课了。废话不多说,进入今天的正题。

一.double精度丢失

public static void main(String[] args) {double a = 3;double b = 3.3;System.out.println(a * b);
}

执行以上java代码,期望打印9.9,但是实际返回的是:9.899999999999999

二.为什么double会精度丢失

这是由于double不是精确计算,存在精度丢失。至于为什么会精度丢失,是由于计算机在进行计算的时候是采用二进制,需要将10进制转换成二进制,但是很多10进制数无法使用二进制来精确表示。

例如:0.1,它对应的二进制0.0001100110011…无限循环,只能无限逼近0.1,这就导致了精度丢失的问题。

想深入了解可以看 这篇文章,讲的不错。

三.BigDecimal错误的用法

可以使用 BigDecimal 类来进行精确计算,可以避免精度丢失的问题。

但是在使用 BigDecimal 也存在很多坑。

  • 1.错误用法一

例如:

public static void main(String[] args) {double a = 0.1;System.out.println(new BigDecimal(a));
}

会打印出:0.1000000000000000055511151231257827021181583404541015625

官方给出的注释如下:

The results of this constructor can be somewhat unpredictable.
One might assume that writing {@code new BigDecimal(0.1)} in
Java creates a {@code BigDecimal} which is exactly equal to
0.1 (an unscaled value of 1, with a scale of 1), but it is
actually equal to
0.1000000000000000055511151231257827021181583404541015625.
This is because 0.1 cannot be represented exactly as a
{@code double}

这是由于0.1无法精确的表示为一个二进制数导致的。

  • 2.错误用法二
public static void main(String[] args) {double a = 0.55555555555555555;System.out.println(BigDecimal.valueOf(a));
}

打印的结果为:0.5555555555555556,这是由于double存在一定的精度,会进行四舍五入,因此在转换为BigDecimal的时候就会我们预想的不一致。

四.BigDecimal正确的用法

注意:通过阅读注释,以下用法也是官方推荐的用法。

public static void main(String[] args) {String a = "0.55555555555555555";System.out.println(new BigDecimal(a));BigDecimal b = new BigDecimal("3");BigDecimal c = new BigDecimal("3.3");System.out.println(b.multiply(c));
}

打印结果为:

0.55555555555555555
9.9

官方注释如下:

The {@code String} constructor, on the other hand, is
perfectly predictable: writing {@code new BigDecimal("0.1")}
creates a {@code BigDecimal} which is <i>exactly</i> equal to
0.1, as one would expect.  Therefore, it is generally
recommended that the {@linkplain #BigDecimal(String)
<tt>String</tt> constructor} be used in preference to this one.

引用:
1.https://www.cnblogs.com/backwords/p/9826773.html
2.https://blog.csdn.net/linghuainian/article/details/90270462

Double计算精度丢失(金融入门知识点)相关推荐

  1. (金融入门知识点)Double类型丢失精度

    Double计算精度丢失原因:Double计算精度丢失(金融入门知识点)__yosemite的博客-CSDN博客_double精度丢失 Double计算精度丢失解决办法:Double类型丢失精度的两种 ...

  2. [ JAVA编程 ] double类型计算精度丢失问题及解决方法

    [ JAVA编程 ] double类型计算精度丢失问题及解决方法 参考文章: (1)[ JAVA编程 ] double类型计算精度丢失问题及解决方法 (2)https://www.cnblogs.co ...

  3. double java 精度丢失_java中double和float精度丢失问题及解决方法

    在讨论两位double数0.2和0.3相加时,毫无疑问他们相加的结果是0.5.但是问题总是如此吗? 下面我们让下面两个doubles数相加,然后看看输出结果: @Test public void te ...

  4. double类型精度丢失问题以及解决方法

    double类型精度丢失问题: (1)加法运算. public static void main(String[] args) {double number1 = 1;double number2 = ...

  5. 用decimal.js库解决JavaScript中计算精度丢失的问题

    项目场景: 涉及小数点的计算 精度丢失原因看这里 解决 用decimal.js库,decimal.js是使用的二进制来计算的, 所以能解决js的精度问题. 安装和引入 执行命令npm i decima ...

  6. java中double类型精度丢失问题及解决方法

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 来源: https://blog.csdn.net/yacolsp ...

  7. float,double等精度丢失问题

    来自MSDN的解释: http://msdn.microsoft.com/zh-cn/c151dt3s.aspx 为何浮点数可能丢失精度浮点十进制值通常没有完全相同的二进制表示形式. 这是 CPU 所 ...

  8. double operator[](int i)_java中double类型精度丢失问题及解决方法

    原文链接:https://blog.csdn.net/yacolspace/article/details/78287394 double类型数据加减操作精度丢失问题 今天在项目中用到double类型 ...

  9. Java中double类型精度丢失的问题_double类型数据加减操作精度丢失解决方法_BigDecimal取整

    BigDecimal在用double做入参的时候,二进制无法精确地表示十进制小数,编译器读到字符串"0.0000002"和"1.0000002"之后,必须把它转 ...

最新文章

  1. mongodb java 日志分析_记一次log4j与mongodb集成引发的问题分析
  2. java.sql.Connection.close() vs null
  3. Error处理:/bin/bash^M: 坏的解释器: 没有该文件或目录(bad interpreter: No such file or directory)...
  4. spring-data-redis 使用
  5. php defunct,通过swoole观察僵尸进程和孤儿进程出现和消亡
  6. [UE4]性能优化指南(美术向)
  7. 【Python CheckiO 题解】First Word
  8. 一文读懂什么是P问题、NP问题和NPC问题
  9. 50 MM配置-库存管理和实际库存-自动建立库存地点
  10. ajax前端实时获取数据
  11. 为什么我会被淘汰(续)
  12. v-for 遍历 Map
  13. linux系统 锐捷_ubuntu 下锐捷完美客户端mentohust
  14. 服务器风扇端子型号,出几样物品-相机连接头,服务器风扇,滤波器,接线端子等等如图...
  15. Namecheap共享虚拟主机使用体验
  16. 计算机专业考研410分,从一个中专生到考研410分的历程
  17. 微信群活码,一个能够将用户自动分流的工具
  18. 1054: 猴子吃桃(C)
  19. Hadoop的两个核心组成
  20. zabbix6.0安装教程(一):安装要求获取方式

热门文章

  1. Uint8 Uint16等的区别
  2. 防火墙、DCD与TCP Keep alive
  3. Eclipse新建Android项目报错解决方案详细汇总
  4. ps 给小姐姐更换背景
  5. 鸿蒙系统 智能手表,魅族官宣:你好,鸿蒙 首个第三方接入鸿蒙OS手机品牌新品亮相...
  6. 基于TensorFlow的开源JS库的网页前端人物动作捕捉的实现
  7. TreeGrid插件简练了解使用
  8. canvas实现图片旋转
  9. “pcl_isfinite”: 找不到标识符
  10. 毕业设计 微信小程序在线免费小说系统(源码+论文)