关于double类型的数据算法失真处理
2016-12-22 23:07
459 查看
double b1=0.1;
double b2 =0.2;
System.out.println(b1+b2);
代码如上,输出结果0.30000000000000004,有没有很奇怪,居然不是0.3
原因是:
double属于floating binary point types,也就是说都double型的数值在相加减的时候,会将数值转换成二进制的数值如10001.10010110011这种表示发再做相加减,但是在转换成二进制代码表示的时候,存储小数部分的位数会有不够的现象,即无限循环小数,这就是造成微差距的主要原因。
怎么办,后面的尾巴肯定不能要,数据明显失真了
用Decimal就不会出现上面的问题了,可以准确的计算小数值,知识Decimal的范围比double小,一般情况下也够用了。
Decimal类型的有效位数达到28位,而double类型的16位,所以Decimal类型比Double类型能表示更精确的浮点数
BigDecimal bd1=new BigDecimal(String.valueOf(b1));
BigDecimal bd2=new BigDecimal(String.valueOf(b2));
System.out.println(bd1.add(bd2));
输出0.3;
ok!!!!!!!!
好记性不如烂笔头!!!!!!!!
(其他的)
double b2 =0.2;
System.out.println(b1+b2);
代码如上,输出结果0.30000000000000004,有没有很奇怪,居然不是0.3
原因是:
double属于floating binary point types,也就是说都double型的数值在相加减的时候,会将数值转换成二进制的数值如10001.10010110011这种表示发再做相加减,但是在转换成二进制代码表示的时候,存储小数部分的位数会有不够的现象,即无限循环小数,这就是造成微差距的主要原因。
怎么办,后面的尾巴肯定不能要,数据明显失真了
用Decimal就不会出现上面的问题了,可以准确的计算小数值,知识Decimal的范围比double小,一般情况下也够用了。
Decimal类型的有效位数达到28位,而double类型的16位,所以Decimal类型比Double类型能表示更精确的浮点数
BigDecimal bd1=new BigDecimal(String.valueOf(b1));
BigDecimal bd2=new BigDecimal(String.valueOf(b2));
System.out.println(bd1.add(bd2));
输出0.3;
ok!!!!!!!!
好记性不如烂笔头!!!!!!!!
(其他的)
相关文章推荐
- importlib模块
- 欧拉计划 43
- Intellij idea 项目目录设置 与包的显示创建
- 16道嵌入式C语言面试题(经典)
- 关于指针的浅析---------指针基础部分2,间接访问和直接访问
- SVD分解与数据压缩
- 生成模型(Generative Model)与判别模型(Discriminative Model)
- 第三十九讲项目4——输入一个正整数,判断其是否为一个回文数
- Python学习记录-2016-12-22
- 自定义View实现导航栏与主面板交互效果
- BZOJ 3529: [Sdoi2014]数表 [莫比乌斯反演 树状数组]
- 教女友学编程-2-先学爬虫
- 个人收藏的一些很有性价比的Github链接
- 字符串输入&操作
- A+B也疯狂
- Qt下载地址
- 【LeetCode】 204. Count Primes
- 欧拉计划 42
- Python Day20
- iOS视频直播