A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 好彩哥 中级黑马   /  2013-9-8 17:49  /  1149 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

前些日子一直在思考一个问题:
  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.
  这就是所谓的精度丢失,是因为小数在转二进制时有些小数是转不清的,丢去了一部分。

《云六的兄弟姐妹们,顶起来啊,,不能清淡啊》

评分

参与人数 1黑马币 +5 收起 理由
黄文伯 + 5 很给力!

查看全部评分

1 个回复

正序浏览

回帖奖励 +2 黑马币

问题,很深呀!!
那如果在程序中这样去写,丢失精度,程序还能编译运行成功吗?
我猜不会编译成功吧,那Double型的值那这个问题在程序中怎么解决呢?
实在是超出了我的能力范围,求解
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马