最近做练习的时候发现了一个有意思的问题,具体如图:

按理说这段代码的输出应该为 28.26,但实际上

分析

于是我上网查了查,大概的解释就是 二进制有时无法准确的表示小数位

大家应该都知道,计算机底层是用二进制来存储数据的,而学过 计算机组成原理 的同学也应该都了解一些 十进制小数 转二进制的弊端,即
某些小数转化为二进制后的位数可能会很大或者是无穷尽的

而float与double类型变量能存储的二进制位数是有限的,多余的位数会被截断,这就造成了数据精度的丢失,这种精度的丢失在浮点数相乘的情况下会显得尤为明显

但是,十进制整数 在转二进制时就不会出现位数无尽的情况

解决

要想解决这一问题,有两种方法

一、先把浮点数的小数位去除,计算结束后再归还小数位,即

这是结果

二、使用java.math包里的 API BigDecimal ,具体的使用方法请移步这篇文章 Java之BigDecimal详解

        double pi = 3.14, r = 3;String pistr = String.valueOf(pi);String rstr = Double.toString(r);BigDecimal rbd = new BigDecimal(rstr);BigDecimal area = new BigDecimal( pistr ).multiply( rbd ).multiply( rbd );System.out.println( area.doubleValue() );

结果同上

需要注意的是, 调用BigDecimal的构造函数时,传入的参数最好为 String 类型的变量,即

new BigDecimal(String str)

int、double类型变量与String类型的转换可参考我之前的文章 java 实现 int、double类型 与 String 类型 相互转换

java中的double相乘-------保留精度相关推荐

  1. Java中关于double、Double相关问题总结

    标题 java中double与Double的区别 声明double变量的时候,加d与不加d有什么区别 java中float与double的区别 java Double 详解 BigDecimal.Do ...

  2. Java中的double类型数据存储探析

    一.double类型的存储表示 Java的浮点类型表示完全按照IEEE754标准(Standards of IEEE 754 floating point numbers),有兴趣可以上IEEE标准网 ...

  3. 关于Java中 求Logn/log2 的精度问题。

    经过本人测试,java 中 , 一直到 2的492 次方(这么大的数,平时够用了) :用 Math.log(n) / Math.log(x) 公式都会产生一个整数,例如 int x = 2 ;    ...

  4. java double 类型_关于Java中的double类型数据

    在初学Java的时候,一般我们都会从基本的数据类型开始学习,而在基本数据类型中,我认为double类型是比较难理解的,并且在以后的学习或工作中,在double类型数据这遇到的坑也是极多的.例如下面的这 ...

  5. Java中让浮点型数据保留两位小数的四种方法

    hello,你好呀,我是灰小猿,一个超会写bug的程序猿! 今天在进行开发的过程中遇到了一个小问题,是关于如何将double类型的数据保留两位小数.突然发现这方面有一点欠缺,就来总结一下. 一.Str ...

  6. java中double超出范围怎么办_在java中对double型运算出现的问题与解决方案

    在许多应用开发中,很多时候都会涉及到金额数字的处理,但由于计算机运算是使用二进制代码进行相关的计算,所以在很多运算中都会出现误差,现以java语言为例作一些简单的介绍. public Test { p ...

  7. java中的double 类型数据相加问题

    问题描述:比如说 double a=3.0 double b=4.0 我 把a+b用 system.out.println输出 得到7.000000000000000006 解决方法:做float或d ...

  8. java中的Double与double的区别

    今天是学习Java基础的第三天,发现了一个小问题,就是Double和double是能相互赋值和转换的,对于之前没有接触过Java的我来说,碰到这种类与基本数据类型能相互赋值的问题是感到不可思议的,我查 ...

  9. javadouble转int四舍五入_如何通过舍入将Java中的double转换为int?

    要将double转换为int并将其四舍五入为最接近的整数(即与典型的(int)(1.8)and 不同(int)(1.2),它们都将"向下舍入"为0并返回1),只需在上加上0.5do ...

最新文章

  1. 数据库基础操作(二)数据库表数据的增删查改
  2. 二维分类教案_大班数学二维分类教案
  3. list java语法_java基础语法 List
  4. 数据结构与算法--二叉树的深度问题
  5. VMware10中安装Mac10.9.3
  6. 安徽工程大学大学计算机基础,安徽工程大学.pdf
  7. 线程的异常捕获与线程池的异常捕获
  8. 基于Matlab使用激光雷达从点云到跟踪列表跟踪车辆仿真(附源码)
  9. linux刷windows phone,老机焕新生!Lumia 950XL也能跑Win10
  10. Mimics和Amira在医学影像处理中的应用介绍
  11. 基于C++编译的车牌识别系统
  12. 酒桌上的那些礼仪规矩~
  13. 一键加速去不掉加锁的_三种方法让你的Service不被“一键加速”和系统杀掉
  14. ASP.NET MVC5 使用NPOI导出ExceL 返回浏览器下载
  15. linux pv信息写在哪里,pv命令详情|linux - 爱资料工具
  16. 做一个校园跑腿小程序需要多少成本?
  17. 人生路上前进的方向----有几条线贯穿自己的人生
  18. Could not write JSON: Infinite recursion (StackOverflowError) (through reference chain:
  19. Free Lossless Audio Codec
  20. 使用 Python 在 2 秒内评估国际象棋位置

热门文章

  1. python pptx 关于在ppt里插入表格,调整合并单元格的问题
  2. python获取文件夹下指定后缀名文件列表(可手工设定是否遍历子文件夹)cmd复制文件命令使用
  3. 腾讯云IM集成(so easy)
  4. C语言求6阶余子式,usdt交易 -usdt交易V3.6.39
  5. 浏览器主页被搜狗劫持如何处理
  6. 移动web开发—— rem布局
  7. Windows Phone 游戏 Roll In The Hole 去除 XBL 服务
  8. google地图标记
  9. 下雨打雷效果(动态)html
  10. java使用阿里云发送通知短信