【JAVA基础中关于double进制问题的解析】
2013-07-26 14:43
162 查看
近日在群中看到一个小兄弟求助:
int a = 58;double b = 0.35;
double c = a*b;
为什么等于20.29999999999997
而不是等于20.3
我在计算机思索一根烟,是啊为什么呢?学习java两年这个问题突然不知怎么回答?经过再三考虑将我的想法发表出来,请大家一起讨论!
1. 首先要明白计算机只识别0和1。
2. 因为在java里面浮点数的表示是根据IEEE754标准来表示的,一般数符位(s)1位,阶码(E)根据浮点数的类型不同占的位数不同,尾数(M)也是根据类型不同占的位数不一样,所以一个计算机能够表示的浮点数的总位数长度是有限的一般32位、64位、80位。
3. 要明白小数在转换为二进制的时候有些小数是无法完全转换的只能取近似值。
4. 如0.35转为二进制为0.01100..........这个二进制再转10进制是无法表示为0.35的只能是无限接近0.35.
这就是大白菜官网u盘装系统所谓的精度丢失,是因为小数在转二进制时有些小数是转不清的,丢去了一部分。
int a = 58;double b = 0.35;
double c = a*b;
为什么等于20.29999999999997
而不是等于20.3
我在计算机思索一根烟,是啊为什么呢?学习java两年这个问题突然不知怎么回答?经过再三考虑将我的想法发表出来,请大家一起讨论!
1. 首先要明白计算机只识别0和1。
2. 因为在java里面浮点数的表示是根据IEEE754标准来表示的,一般数符位(s)1位,阶码(E)根据浮点数的类型不同占的位数不同,尾数(M)也是根据类型不同占的位数不一样,所以一个计算机能够表示的浮点数的总位数长度是有限的一般32位、64位、80位。
3. 要明白小数在转换为二进制的时候有些小数是无法完全转换的只能取近似值。
4. 如0.35转为二进制为0.01100..........这个二进制再转10进制是无法表示为0.35的只能是无限接近0.35.
这就是大白菜官网u盘装系统所谓的精度丢失,是因为小数在转二进制时有些小数是转不清的,丢去了一部分。
相关文章推荐
- JAVA基础中关于double进制问题的解析 推荐
- java基础中Integer值用==和equals判断相等问题解析
- java基础解析系列(五)---HashMap并发下的问题以及HashTable和CurrentHashMap的区别
- 工作学习 问题总结 java 基础 关于arraylist.addall
- Java JSON解析中一个关于双引号的问题
- 关于java中Double类型的运算精度问题
- JAVA基础:Java多语言编码问题解析
- 关于一些基础的Java问题的解答(一)
- 关于java中Double类型的运算精度问题
- java基础阶段关于斐波那契数列的问题
- Java基础---关于Java中类的修饰符问题的总结
- 关于java中Double类型的运算精度问题(转)
- 关于一些基础的Java问题的解答(四)
- 关于java中Double类型的运算精度问题
- 关于java中Double类型的运算精度问题
- 中文化和国际化问题权威解析之二:Java国际化基础
- 【JAVA基础】关于JAVA中的static方法、并发问题以及JAVA运行时内存模型
- 关于问题:无法解析类型java.lang.Object
- 关于java中Double类型的运算精度问题
- 关于java中Double类型的运算精度问题