解决0.1+0.2≠0.3的问题
程序员文章站
2022-04-07 18:23:20
0.1+0.2≠0.3问题先跑一段Java代码:出BUG了吗???刚学习编程的小伙伴可能会摸不着头脑,经过测试这个问题同样的也会出现在如c/c++,JS,python语言中。原因分析其实,这并不是出Bug了,只是因为计算机无法100%准确地存储如0.1、0.2这样的小数,进而导致两个数进行加法运算返回的结果精度也可能会跟着出现问题。下面有更详细的分析:1.首先了解十进制化二进制的原则:(1)整数部分对2取余然后逆序排列。(2)小数部分乘2取整数部分,然后顺序排列。2.先来尝试把十进制的0....
相信小伙伴们在编程的时候会遇到这种问题,在进行浮点数运算有时得到结果会带有一个"小尾巴",就像下面这样:
先跑一段Java代码:
出BUG了吗???
刚学习编程的小伙伴可能会摸不着头脑,经过测试这个问题同样的也会出现在如c/c++,JS,python语言中。
原因分析
其实,这并不是出Bug了,只是因为计算机无法100%准确地存储如0.1、0.2这样的小数,进而导致两个数进行加法运算返回的结果精度也可能会跟着出现问题。下面有更详细的分析:
1.首先了解十进制化二进制的原则:
(1)整数部分对2取余然后逆序排列。(2)小数部分乘2取整数部分,然后顺序排列。
2.先来尝试把十进制的0.1化成二进制得到:
0.1(十进制)= 0.0001100110011…0011…(二进制)
结果将不断循环0011这个片段,计算机将永远都存不下0.1的二进制小数,这就是问题所在了。像单精度浮点型数据用32位存储,双精度浮点型用64位存储,但是它们始终是有限位数,用来存储0.1将不可避免出现精度缺失的问题。只有当存储如1/2、1/4、1/8、3/4、5/8…这种形式的小数时才能准确。所以又推断0.2也会出现无限循环的情况,而结果也确实如此:
0.2(十进制)= 0.0011001100110011…0011…(二进制)
3.另外尝试其他情况如双精度浮点型的0.1+0.3:
还有单精度浮点型的0.1+0.2:
所以并不是只要出现0.1或0.2等的浮点数运算就会一定会出现精度缺失,我们也无法预测到所有可能会出现精度缺失的情况,所以找到解决办法来避免在进行涉及浮点数运算的时候出现这种“意外”才是最重要的。
解决办法
通过保留小数点位数,剔除结果可能出现的“小尾巴”即可:
下面提供Java以及JS保留小数点位数的示例:
1.Java解决方案:
public static void main(String[] args){
double a = 0.1d;
double b = 0.2d;
double c = a+b;
BigDecimal big = new BigDecimal(c);
double result1 = big.setScale(2,BigDecimal.ROUND_HALF_UP).doubleValue();//转成double
String result2 = big.setScale(2,BigDecimal.ROUND_HALF_UP).toString();//转成String
System.out.println(result1);
System.out.println(result2);
}
2.JS解决方案:
function test(){
var a = 0.1;
var b = 0.2;
var c = a+b;
console.info(toFixed(c,2))
}
/*
* 对num保留小数点后digit位并返回
*/
function toFixed(num,digit){
var times = Math.pow(10, digit);
var roundNum = Math.round(num * times) / times;
return roundNum.toFixed(digit);
}
收工!
本文地址:https://blog.csdn.net/Liuyundssda/article/details/110455188
推荐阅读
-
不能连接Wireless Zero Configuration服务不能自动启的问题解决方法
-
从Myeclipse 导入到eclipse中无法识别为 web项目 问题的解决步骤
-
Mybatis传单个参数和
标签同时使用的问题及解决方法 -
yii2整合百度编辑器umeditor及umeditor图片上传问题的解决办法
-
mysql 数据同步 出现Slave_IO_Running:No问题的解决方法小结
-
完美解决关于禁止ViewPager预加载的相关问题
-
iOS10适配之权限Crash问题的完美解决方案
-
Mysql彻底解决中文乱码问题的方案(Illegal mix of collations for operation)
-
基于tomcat8 编写字符编码Filter过滤器无效问题的解决方法
-
Android 解决WebView调用loadData()方法显示乱码的问题