java中的double相乘-------保留精度
最近做练习的时候发现了一个有意思的问题,具体如图:
按理说这段代码的输出应该为 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相乘-------保留精度相关推荐
- Java中关于double、Double相关问题总结
标题 java中double与Double的区别 声明double变量的时候,加d与不加d有什么区别 java中float与double的区别 java Double 详解 BigDecimal.Do ...
- Java中的double类型数据存储探析
一.double类型的存储表示 Java的浮点类型表示完全按照IEEE754标准(Standards of IEEE 754 floating point numbers),有兴趣可以上IEEE标准网 ...
- 关于Java中 求Logn/log2 的精度问题。
经过本人测试,java 中 , 一直到 2的492 次方(这么大的数,平时够用了) :用 Math.log(n) / Math.log(x) 公式都会产生一个整数,例如 int x = 2 ; ...
- java double 类型_关于Java中的double类型数据
在初学Java的时候,一般我们都会从基本的数据类型开始学习,而在基本数据类型中,我认为double类型是比较难理解的,并且在以后的学习或工作中,在double类型数据这遇到的坑也是极多的.例如下面的这 ...
- Java中让浮点型数据保留两位小数的四种方法
hello,你好呀,我是灰小猿,一个超会写bug的程序猿! 今天在进行开发的过程中遇到了一个小问题,是关于如何将double类型的数据保留两位小数.突然发现这方面有一点欠缺,就来总结一下. 一.Str ...
- java中double超出范围怎么办_在java中对double型运算出现的问题与解决方案
在许多应用开发中,很多时候都会涉及到金额数字的处理,但由于计算机运算是使用二进制代码进行相关的计算,所以在很多运算中都会出现误差,现以java语言为例作一些简单的介绍. public Test { p ...
- java中的double 类型数据相加问题
问题描述:比如说 double a=3.0 double b=4.0 我 把a+b用 system.out.println输出 得到7.000000000000000006 解决方法:做float或d ...
- java中的Double与double的区别
今天是学习Java基础的第三天,发现了一个小问题,就是Double和double是能相互赋值和转换的,对于之前没有接触过Java的我来说,碰到这种类与基本数据类型能相互赋值的问题是感到不可思议的,我查 ...
- javadouble转int四舍五入_如何通过舍入将Java中的double转换为int?
要将double转换为int并将其四舍五入为最接近的整数(即与典型的(int)(1.8)and 不同(int)(1.2),它们都将"向下舍入"为0并返回1),只需在上加上0.5do ...
最新文章
- 数据库基础操作(二)数据库表数据的增删查改
- 二维分类教案_大班数学二维分类教案
- list java语法_java基础语法 List
- 数据结构与算法--二叉树的深度问题
- VMware10中安装Mac10.9.3
- 安徽工程大学大学计算机基础,安徽工程大学.pdf
- 线程的异常捕获与线程池的异常捕获
- 基于Matlab使用激光雷达从点云到跟踪列表跟踪车辆仿真(附源码)
- linux刷windows phone,老机焕新生!Lumia 950XL也能跑Win10
- Mimics和Amira在医学影像处理中的应用介绍
- 基于C++编译的车牌识别系统
- 酒桌上的那些礼仪规矩~
- 一键加速去不掉加锁的_三种方法让你的Service不被“一键加速”和系统杀掉
- ASP.NET MVC5 使用NPOI导出ExceL 返回浏览器下载
- linux pv信息写在哪里,pv命令详情|linux - 爱资料工具
- 做一个校园跑腿小程序需要多少成本?
- 人生路上前进的方向----有几条线贯穿自己的人生
- Could not write JSON: Infinite recursion (StackOverflowError) (through reference chain:
- Free Lossless Audio Codec
- 使用 Python 在 2 秒内评估国际象棋位置