double和float计算精度不准的问题
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计算精度不准的问题相关推荐
- 当double类型数学计算精度偏差解决
使用Java.math包中的BigDecimal类进行高精度计算 1. 通过构造函数的方式把要计算的值给BigDecimal对象传入,使用BigDecimal对象进行乘除加减操作 //通过构造函数的 ...
- double和float的精度和取值范围
(1)取值范围 float和double的范围是由指数的位数来决定的. float的指数位有8位,而double的指数位有11位,分布如下: float: 1bit(符号位) 8bits(指数位) 2 ...
- Python 中 float 计算精度问题
问题 浮点数不能精确的表示十进制数,并且即使是最简单的数学运算也会产生误差.该错误是由于浮点数的存储方式引起的. 如在Python中,浮点数( float )默认精度为17位,在执行简单的浮点数加法计 ...
- double 转float 损失精度
(一)32位平台: 分为有符号型与无符号型. 有符号型: short 在内存中占两个字节,范围为-2^15~(2^15-1) int 在内存中占四个字节,范围为-2^31~(2^31-1) long在 ...
- Java中如何解决double和float精度不准的问题
我们知道浮点数是无法在计算机中准确表示的,例如0.1在计算机中只是表示成了一个近似值,因此,对付点数的运算时结果具有不可预知性. 在进行数字运算时,如果有double或float类型的浮点数参与计算, ...
- js parsefloat 精度_js 浮点小数计算精度问题 parseFloat 精度问题
在js中进行以元为单位进行金额计算时 使用parseFloat会产生精度问题 var price = 10.99; var quantity = 7; var needPay = parseFloat ...
- Double 与 Float 的值的比較结果
首先看geeksforgeeks上的两个程序: 程序1: #include<stdio.h> int main() {float x = 0.1;if (x == 0.1)printf(& ...
- 支付价格计算中精度问题之double,float
前言 前段时间开发新的微信小程序,借此机会将老掉牙的支付模块重构,并且支持现金支付(之前都是虚拟币支付),在重构期间遇到计算上的一些精度问题,虽然数额影响非常小但是影响比较大,我觉得有必要总结以下遇到 ...
- 【转】float与double的范围和精度
原文:http://blog.csdn.net/wuna66320/article/details/1691734 1 范围 float和double的范围是由指数的位数来决定的. float的指数位 ...
最新文章
- 39 JavaScript中的严格模式
- 数据结构与算法09 之图
- jdk8切换成jdk6_运行中的JDK语言功能预览:切换表达式
- DNS解析原理与Bind部署DNS服务
- Linux文件属性1——文件类型
- diy配置程序php,poscmsDiy字段之文件类型设计指南
- mysql数据库优化语句_【MySQL】10条SQL优化语句,让你的MySQL数据库跑得更快!
- linux man指令问题
- Elastic Stack之Elasticsearch 5.6.12 集群部署实战
- 易语言升级版火山软件开发平台现在很庞大了
- python进阶中文版_GitHub - lcm2179/Intermediate-Python: 《Python进阶》(Intermediate Python 中文版)...
- 计算机显卡发展史,外置显卡发展简史
- Android MD5 加密解密
- python入门——快乐的数字
- py3_VSCode 配置 Python 环境以及初识 Python 正则表达式
- 最优传输论文(二十六):Sliced Wasserstein Discrepancy for Unsupervised Domain Adaptation论文原理
- 中国队输球是有原因滴
- fatal: unable to access ‘xxx‘: schannel: failed to receive handshake, SSL/TLS connection f...
- 超级码力在线编程大赛初赛第1场-1-树木规划题解
- Ajax使用教程,及增删改查
热门文章
- php symfony 安装,Symfony的安装和配置方法
- cheatengine找不到数值_找商网:百度爱采购与其他B2B平台有何不同,为何能够后来居上?...
- 如何用计算机对cad的草图,AutoCAD2020图纸如何导入su草图大师软件?
- Java项目:图书管理系统(java+swing+Gui+Mysql)
- 轮播切换_javascript基础(一)——轮播图
- python爬取哔哩哔哩视频_荐爬取哔哩哔哩中的cosplay小视频
- asp导出word中文乱码_解决文档打开乱码问题丨小工具系列
- qprocess start怎么判断是否结束_面试结束后,如何判断自己是否有戏?看有无这8大信号!...
- RXSwift基本使用1
- 【UIDynamic例子】挂起的方块