2019独角兽企业重金招聘Python工程师标准>>>

1、首先我们要知道float和double型,的底层实现是二进制的。十进制中的一个有限位数小数,转换成二进制就不一定是有限位数了,一旦位数超过的float和double型的位数宽度,就会出现“精度溢出”。所以float和double型是为了科学计算而设计的,并不适合精确的十进制计算.

例子: 就像一个十进制的小数,要不断地乘以2取整,但在这个过程中可能会一直循环下去,这就造成了数据的不精确。

所以在必须要求数据的精确度时,不能使用float和double.

public class Test{

public static void main(String[] args)

{

System.out.println(0.05+0.01);

System.out.println(1.0-0.42);

System.out.println(4.015*100);

System.out.println(123.3/100);

}

}

输出结果为:

0.060000000000000005

0.5800000000000001

401.49999999999994

1.2329999999999999

BigDecimal类可解决计算精度问题 可使用BigDecimal类创建一个封装类。封装加减乘除操作

例:对一个小数进行指定位数的四舍五入:

BigDecimal bd = new BigDecimal("0.9851095");

BigDecimal one = new BigDecimal("1");

System.out.println(bd.divide(one, 3, BigDecimal.ROUND_HALF_UP));

BigDecimal中还有很多相关的数值之间的计算方法,以及精确到的位数和四舍五入等。

注意:BigDecimal它的构造函数很多。

我挑最常用的两个 来演示一下:一个就是BigDecimal(double val),另一个就是BigDecimal(String str)。

下面是两个浮点数相减的例子来说明:
public static void main(String[] args) {
double a = 1;
double b = 0.9;
BigDecimal a1 = new BigDecimal(Double.toString(a));
BigDecimal b1 = new BigDecimal(Double.toString(b));
BigDecimal a2 = new BigDecimal(a);
BigDecimal b2 = new BigDecimal(b);
double c = a1.subtract(b1).doubleValue();
double d = a2.subtract(b2).doubleValue();
System.out.println(“c=”+c);
System.out.println(“d=”+d);
}

结果为:
c=0.1
d=0.09999999999999998

可以得出结论:

利用double作为参数的构造函数,无法精确构造一个BigDecimal对象,需要自己指定一个上下文的环境,也就是指定精确位。而利用String对象作为参数传入的构造函数能精确的构造出一个BigDecimal对象。

转载于:https://my.oschina.net/u/2429470/blog/487486

double和float计算精度不准的问题相关推荐

  1. 当double类型数学计算精度偏差解决

    使用Java.math包中的BigDecimal类进行高精度计算 1.  通过构造函数的方式把要计算的值给BigDecimal对象传入,使用BigDecimal对象进行乘除加减操作 //通过构造函数的 ...

  2. double和float的精度和取值范围

    (1)取值范围 float和double的范围是由指数的位数来决定的. float的指数位有8位,而double的指数位有11位,分布如下: float: 1bit(符号位) 8bits(指数位) 2 ...

  3. Python 中 float 计算精度问题

    问题 浮点数不能精确的表示十进制数,并且即使是最简单的数学运算也会产生误差.该错误是由于浮点数的存储方式引起的. 如在Python中,浮点数( float )默认精度为17位,在执行简单的浮点数加法计 ...

  4. double 转float 损失精度

    (一)32位平台: 分为有符号型与无符号型. 有符号型: short 在内存中占两个字节,范围为-2^15~(2^15-1) int 在内存中占四个字节,范围为-2^31~(2^31-1) long在 ...

  5. Java中如何解决double和float精度不准的问题

    我们知道浮点数是无法在计算机中准确表示的,例如0.1在计算机中只是表示成了一个近似值,因此,对付点数的运算时结果具有不可预知性. 在进行数字运算时,如果有double或float类型的浮点数参与计算, ...

  6. js parsefloat 精度_js 浮点小数计算精度问题 parseFloat 精度问题

    在js中进行以元为单位进行金额计算时 使用parseFloat会产生精度问题 var price = 10.99; var quantity = 7; var needPay = parseFloat ...

  7. Double 与 Float 的值的比較结果

    首先看geeksforgeeks上的两个程序: 程序1: #include<stdio.h> int main() {float x = 0.1;if (x == 0.1)printf(& ...

  8. 支付价格计算中精度问题之double,float

    前言 前段时间开发新的微信小程序,借此机会将老掉牙的支付模块重构,并且支持现金支付(之前都是虚拟币支付),在重构期间遇到计算上的一些精度问题,虽然数额影响非常小但是影响比较大,我觉得有必要总结以下遇到 ...

  9. 【转】float与double的范围和精度

    原文:http://blog.csdn.net/wuna66320/article/details/1691734 1 范围 float和double的范围是由指数的位数来决定的. float的指数位 ...

最新文章

  1. 39 JavaScript中的严格模式
  2. 数据结构与算法09 之图
  3. jdk8切换成jdk6_运行中的JDK语言功能预览:切换表达式
  4. DNS解析原理与Bind部署DNS服务
  5. Linux文件属性1——文件类型
  6. diy配置程序php,poscmsDiy字段之文件类型设计指南
  7. mysql数据库优化语句_【MySQL】10条SQL优化语句,让你的MySQL数据库跑得更快!
  8. linux man指令问题
  9. Elastic Stack之Elasticsearch 5.6.12 集群部署实战
  10. 易语言升级版火山软件开发平台现在很庞大了
  11. python进阶中文版_GitHub - lcm2179/Intermediate-Python: 《Python进阶》(Intermediate Python 中文版)...
  12. 计算机显卡发展史,外置显卡发展简史
  13. Android MD5 加密解密
  14. python入门——快乐的数字
  15. py3_VSCode 配置 Python 环境以及初识 Python 正则表达式
  16. 最优传输论文(二十六):Sliced Wasserstein Discrepancy for Unsupervised Domain Adaptation论文原理
  17. 中国队输球是有原因滴
  18. fatal: unable to access ‘xxx‘: schannel: failed to receive handshake, SSL/TLS connection f...
  19. 超级码力在线编程大赛初赛第1场-1-树木规划题解
  20. Ajax使用教程,及增删改查

热门文章

  1. php symfony 安装,Symfony的安装和配置方法
  2. cheatengine找不到数值_找商网:百度爱采购与其他B2B平台有何不同,为何能够后来居上?...
  3. 如何用计算机对cad的草图,AutoCAD2020图纸如何导入su草图大师软件?
  4. Java项目:图书管理系统(java+swing+Gui+Mysql)
  5. 轮播切换_javascript基础(一)——轮播图
  6. python爬取哔哩哔哩视频_荐爬取哔哩哔哩中的cosplay小视频
  7. asp导出word中文乱码_解决文档打开乱码问题丨小工具系列
  8. qprocess start怎么判断是否结束_面试结束后,如何判断自己是否有戏?看有无这8大信号!...
  9. RXSwift基本使用1
  10. 【UIDynamic例子】挂起的方块