问题:

对两个double类型的值进行运算,有时会出现结果值异常的问题。比如:
System.out.println(19.99+20); System.out.println(1.0-0.66); System.out.println(0.033*100); System.out.println(12.3/100);
输出:
39.989999999999995 0.33999999999999997 3.3000000000000003 0.12300000000000001
Java中的简单浮点数类型float和double不能够精确运算。这个问题其实不是JAVA的bug,因为计算机本身是二进制的,而浮点数实际上只是个近似值,所以从二进制转化为十进制浮点数时,精度容易丢失,导致精度下降。
关于精度损失的原理可以很简单的讲,首先一个正整数在计算机中表示使用01010形式表示的,浮点数也不例外。
比如11,11除以2等于5余1
5除以2等于2余1
2除以2等于1余0
1除以2等于0余1
所以11二进制表示为:1011.
double类型占8个字节,64位,第1位为符号位,后面11位是指数部分,剩余部分是有效数字。
正整数除以2肯定会有个尽头的,之后二进制还原成十进制只需要乘以2即可。
举个例子:0.99用的有效数字部分,
0.99 * 2 = 1+0.98 --> 1
0.98 * 2 = 1+0.96 --> 1
0.96 * 2 = 1+0.92 -- >1
0.92 * 2 = 1+0.84 -- >1
...............
这样周而复始是没法有尽头的,而double有效数字有限,所以必定会有损失,所以二进制无法准确表示0.99,就像十进制无法准确表示1/3一样。
解决办法:
在《Effective Java》中提到一个原则,那就是float和double只能用来作科学计算或者是工程计算,但在商业计算中我们要用java.math.BigDecimal,通过使用BigDecimal类可以解决上述问题,首先需要注意的是,直接使用字符串来构造BigDecimal是绝对没有精度损失的,如果用double或者把double转化成string来构造BigDecimal依然会有精度损失,所以我觉得这种解决方法就是在使用中就把浮点数用string来表示存放,涉及到运算直接用string构造double,否则肯定会有精度损失。
1. 相加
/**
* 相加
* @param double1
* @param double2
* @return
*/
public static double add(String doubleValA, String doubleValB) {
BigDecimal a2 = new BigDecimal(doubleValA);
BigDecimal b2 = new BigDecimal(doubleValB);
return a2.add(b2).doubleValue();
}
2. 相减
/**
* 相减
* @param double1
* @param double2
* @return
*/
public static double sub(String doubleValA, String doubleValB) {
BigDecimal a2 = new BigDecimal(doubleValA);
BigDecimal b2 = new BigDecimal(doubleValB);
return a2.subtract(b2).doubleValue();
}
3. 相乘
/**
* 相乘
* @param double1
* @param double2
* @return
*/
public static double mul(String doubleValA, String doubleValB) {
BigDecimal a2 = new BigDecimal(doubleValA);
BigDecimal b2 = new BigDecimal(doubleValB);
return a2.multiply(b2).doubleValue();
}
4. 相除
/**
* 相除
* @param double1
* @param double2
* @param scale 除不尽时指定精度
* @return
*/
public static double div(String doubleValA, String doubleValB, int scale) {
BigDecimal a2 = new BigDecimal(doubleValA);
BigDecimal b2 = new BigDecimal(doubleValB);
return a2.divide(b2, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
}
5. 主函数调用
public static void main(String[] args) {
String doubleValA = "3.14159267";
String doubleValB = "2.358";
System.out.println("add:" + add(doubleValA, doubleValB));
System.out.println("sub:" + sub(doubleValA, doubleValB));
System.out.println("mul:" + mul(doubleValA, doubleValB));
System.out.println("div:" + div(doubleValA, doubleValB, 8));
}
结果展示如下所示:
add:5.49959267 sub:0.78359267 mul:7.40787551586 div:1.33231241
所以最好的方法是完全抛弃double,用string和java.math.BigDecimal。
java遵照IEEE制定的浮点数表示法来进行float,double运算。这种结构是一种科学计数法,用符号、指数和尾数来表示,底数定为2——即把一个浮点数表示为尾数乘以2的指数次方再添上符号。具体底层如何存储以及如何进行运行请继续关注我的博客,后续我会将详情总结好的。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持!
# java
# 浮点数
# Java LinkedHashMap 底层实现原理分析
# 在java中ArrayList集合底层的扩容原理
# Java synchronize底层实现原理及优化
# Java CAS底层实现原理实例详解
# JAVA序列化和反序列化的底层实现原理解析
# JAVA字符串类型switch的底层原理详析
# Java并发底层实现原理学习心得
# Java集合的总体框架相关知识总结
# Java集合中contains方法的效率对比分析
# Java基础学习之集合底层原理
# 会有
# 的是
# 是个
# 也不
# 是一种
# 有个
# 就像
# 我觉得
# 正整数
# 最好的
# 相减
# 但在
# 这个问题
# 就把
# 很简单
# 要用
# 或者是
# 只需要
# 周而复始
相关文章:
如何快速生成专业多端适配建站电话?
建站之星后台管理:高效配置与模板优化提升用户体验
建站之星下载版如何获取与安装?
高端智能建站公司优选:品牌定制与SEO优化一站式服务
网站规划与制作是什么,电子商务网站系统规划的内容及步骤是什么?
制作网站外包平台,自动化接单网站有哪些?
如何选购建站域名与空间?自助平台全解析
建站之星如何快速生成多端适配网站?
网站制作难吗安全吗,做一个网站需要多久时间?
合肥制作网站的公司有哪些,合肥聚美网络科技有限公司介绍?
制作网页的网站有哪些,电脑上怎么做网页?
独立制作一个网站多少钱,建立网站需要花多少钱?
子杰智能建站系统|零代码开发与AI生成SEO优化指南
如何在IIS中新建站点并配置端口与IP地址?
如何登录建站主机?访问步骤全解析
如何选择服务器才能高效搭建专属网站?
如何制作算命网站,怎么注册算命网站?
常州企业建站如何选择最佳模板?
如何通过宝塔面板实现本地网站访问?
网站建设制作、微信公众号,公明人民医院怎么在网上预约?
C#怎么创建控制台应用 C# Console App项目创建方法
如何高效完成自助建站业务培训?
上海制作企业网站有哪些,上海有哪些网站可以让企业免费发布招聘信息?
成都响应式网站开发,dw怎么把手机适应页面变成网页?
建站与域名管理如何高效结合?
做企业网站制作流程,企业网站制作基本流程有哪些?
盘锦网站制作公司,盘锦大洼有多少5G网站?
长沙做网站要多少钱,长沙国安网络怎么样?
常州自助建站:操作简便模板丰富,企业个人快速搭建网站
中山网站制作网页,中山新生登记系统登记流程?
高防服务器租用如何选择配置与防御等级?
如何通过PHP快速构建高效问答网站功能?
香港服务器租用费用高吗?如何避免常见误区?
c++如何打印函数堆栈信息_c++ backtrace函数与符号名解析【方法】
东莞专业制作网站的公司,东莞大学生网的网址是什么?
制作门户网站的参考文献在哪,小说网站怎么建立?
极客网站有哪些,DoNews、36氪、爱范儿、虎嗅、雷锋网、极客公园这些互联网媒体网站有什么差异?
如何在阿里云购买域名并搭建网站?
广州网站制作的公司,现在专门做网站的公司有没有哪几家是比较好的,性价比高,模板也多的?
建站之星后台密码遗忘?如何快速找回?
如何高效搭建专业期货交易平台网站?
如何选择适配移动端的WAP自助建站平台?
成都网站制作公司哪家好,四川省职工服务网是做什么用?
实惠建站价格推荐:2025年高性价比自助建站套餐解析
C++如何编写函数模板?(泛型编程入门)
Bpmn 2.0的XML文件怎么画流程图
如何使用Golang table-driven基准测试_多组数据测量函数效率
制作ppt免费网站有哪些,有哪些比较好的ppt模板下载网站?
已有域名建站全流程解析:网站搭建步骤与建站工具选择
*请认真填写需求信息,我们会在24小时内与您取得联系。