程序中两个Double类型相加出现误差的解决办法
今天在自己做的系统中,发现了一个奇怪的现象:几个Double类型的数据相加,到最后得出的金额比正确数值总是少了几毛钱。以为是程序里的计算方法有问题,可是排查了很多地方,始终没有找到问题出在哪里。最后干脆把计算方法一句一句拆分,得到了最后最简单的一步,就是把两个具体的数值相加,但是最后的结果居然还是错误的。比如,现在已经到了最简单的一步:
代码如下:
double n = 171.6;
double m = 28.17;
double k = n + m;
按理说k的值应该是199.77,但其实得到的居然是199.76999999999998。
我们的系统里有保留小数位数为4位,按理是可以四舍五入成199.77的。但是因为有做金额的合计,是几十甚至几百个数据的相加,由于每两个数相加的时候都可能产生上述误差,因此最后得到的结果已经有了近0.7的误差,就算再四舍五入也于事无补了。
上网查了一下相关资料,觉得CSDN论坛里的这个帖子的解释还是比较详细的:http://bbs.csdn.net/topics/300023952,大意是说由于运算的时候进行了进制的转换造成的(见8楼回复),所有的精度类型在几乎所有语言下都有这个问题。比较有效的解决办法是使用BigDecimal(见14楼回复),但是我个人认为那个BigDecimal的解决办法太麻烦了,至少对于我的系统来说是这样。还不如每加一次之后都进行一次字符串转换,保留有效的小数位数,比如,上述语句可以改写成:
代码如下:
double n = 171.6;
double m = 28.17;
//double k = n + m;
String kn = (n + m).ToString("N4"); //保留4位小数
double k = Convert.ToDouble(kn);
也就是说,在String kn这一步,就已经把误差调整好了,得到的k值就是正确的了。这样每次相加都处理一下误差,无论要算多少个数据的合计也不用担心会出现误差过大的情况了。
当然最好是把这种处理方法做成一个公用方法,专门用来处理两个数的相加。
相关推荐
-
程序中两个Double类型相加出现误差的解决办法
今天在自己做的系统中,发现了一个奇怪的现象:几个Double类型的数据相加,到最后得出的金额比正确数值总是少了几毛钱.以为是程序里的计算方法有问题,可是排查了很多地方,始终没有找到问题出在哪里.最后干脆把计算方法一句一句拆分,得到了最后最简单的一步,就是把两个具体的数值相加,但是最后的结果居然还是错误的.比如,现在已经到了最简单的一步: 复制代码 代码如下: double n = 171.6;double m = 28.17;double k = n + m; 按理说k的值应该是199.77,但
-
java double类型相加精度问题的解决
我就废话不多说了,大家还是直接看代码吧~ package com.hxyl.action; import java.text.DecimalFormat; public class Test { public static void main(String[] args) { // DecimalFormat 类主要靠 # 和 0 两种占位符号来指定数字长度.0 表示如果位数不足则以 0 填充,# 会把最后面的零默认省略. DecimalFormat df = new DecimalFormat
-
ASP.NET 程序中删除文件夹导致session失效问题的解决办法分享
在Global中 Application_Start 添加 如: 复制代码 代码如下: void Application_Start(object sender, EventArgs e) { //在应用程序启动时运行的代码 System.Reflection.PropertyInfo p = typeof(System.Web.HttpRuntime).GetProperty("FileChangesMonitor", System.Reflect
-
Java学习笔记:关于Java double类型相加问题
目录 Java double类型相加问题 一.这个时候就要采用BigDecimal函数进行运算 二.double 三种加法比较 Java Double类详解 Double 类的构造方法 Double 类的常用方法 Double 类的常用常量 Java double类型相加问题 多个double类型的数直接相加的时候,可能存在精度误差.( 由于计算机算法以及硬件环境决定只能识别 0 1.计算机默认的计算结果在都在一个指定精度范围之内,想往深的了解,可以学习数值分析等) 在金融方面是绝对不允许的,好
-
java中double类型运算结果异常的解决方法
问题: 对两个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 解决方法: J
-
微信小程序 免费SSL证书https、TLS版本问题的解决办法
微信小程序 免费SSL证书https.TLS版本问题的解决办法 微信小程序与第三方服务器通讯的域名5个必要条件 1.一个已备案的域名,不是localhost.也不是127.0.0.1,域名不能加端口 2.加ssl证书,也就是https://~~~ 4.HTTPS 服务器的 TLS 版本支持1.2及以下版本,一般就是1.0.1.1.1.2要同时支持这三个版本,一个也不能少,要不然就会出现下面这种情况 5.微信小程序后台加上合法域名设置(一个月内改的次数是有限的,且行且珍惜)如下图 以上5个条件,必
-
后端接收不到AngularJs中$http.post发送的数据原因分析及解决办法
1.问题: 后端接收不到AngularJs中$http.post发送的数据,总是显示为null 示例代码: $http.post(/admin/KeyValue/GetListByPage, { pageindex: 1, pagesize: 8 }) .success(function(){ alert("Mr靖"); }); 代码没有错,但是在后台却接收不到数据,这是为什么呢? 用火狐监控:参数是JSON格式 用谷歌监控:传参方式是request payload 可以发现传参方式是
-
java 中遍历取值异常(Hashtable Enumerator)解决办法
java 中遍历取值异常(Hashtable Enumerator)解决办法 用迭代器取值时抛出的异常:java.util.NoSuchElementException: Hashtable Enumerator 示例代码 //使用迭代器遍历 Iterator<String> it = tableProper.stringPropertyNames().iterator(); sqlMap = new HashMap<String,String>(); while(it.hasNe
-
Python中str is not callable问题详解及解决办法
Python中str is not callable问题详解及解决办法 问题提出: 在Python的代码,在运行过程中,碰到了一个错误信息: python代码: def check_province_code(province, country): num = len(province) while num <3: province = ''.join([str(0),province]) num = num +1 return country + province 运行的错误信息: check
-
Eclipse中Debug时鼠标悬停不能查看变量值解决办法
问题描述:Eclipse在Debug模式下,当鼠标移动到某个变量上面时不自动显示该变量对应的值. 解决方法:在Eclipse中点击 Window->Preferences->Java->Editor->Hovers, 勾选Variable Values,(如果Combined Hover已经选择了,就取消它), 然后点击Apply,最后点OK. 有时不需要勾选Variable Values,只勾选Combined Hover也能查看变量值,所以勾不勾选多试几下,Debug可能就好了
随机推荐
- [js]一个只删除所有font标签的正则函数
- 数据库 MySQL中文乱码解决办法总结
- 正则表达式详细介绍(上)
- java生成excel报表文件示例
- 一个方法搞定iOS下拉放大及上推缩小
- PHP版微信小店接口开发实例
- php 魔术函数使用说明
- c#字符串去掉空格的二种方法(去掉两端空格)
- php模拟post行为代码总结(POST方式不是绝对安全)
- Linux shell脚本输出日志笔记整理(必看篇)
- Linux VPS安全设置之三:使用DDOS deflate抵御少量DDOS攻击
- PHP调用MySQL的存储过程的实现代码
- jquery操作select元素和option的实例代码
- javascript的几种写法总结
- 详解iframe与frame的区别
- Android中比较常见的Java super关键字
- Android数据加密之Des加密详解
- 邻接表无向图的Java语言实现完整源码
- CI框架(CodeIgniter)操作redis的方法详解
- JS和Canvas实现图片的预览压缩和上传功能