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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© jwx555 中级黑马   /  2014-7-25 13:22  /  4201 人查看  /  16 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

double a = 0.01 ;
double b = 0.09 ;

System.out.println(a+b) ;

输出结果:0.09999999999999999

16 个回复

正序浏览
cat73 黑马帝 2014-7-26 18:34:59
16#
如果要绝对精准 就不要用浮点型 浮点型总会有精度损失的

点评

比较对你的猫咪感兴趣  发表于 2014-7-26 19:49
回复 使用道具 举报
jwx555 发表于 2014-7-25 17:38
float?

float 0.01+0.04 你再试试

我到网上查了下,这个问题跟计算机的二进制编码有关系,当用二进制表示小数时,他会存在误差,而不是像整数时的那么精确。具体的一些我也说不清楚了。很抱歉哈。
回复 使用道具 举报
357016138 发表于 2014-7-26 00:50
double a = 0.01 ;
double b = 0.09 ;

很犀利的点评
回复 使用道具 举报
double a = 0.01 ;
double b = 0.09 ;

System.out.println("0.1") ;
回复 使用道具 举报
adent 中级黑马 2014-7-26 00:39:06
12#
fantacyleo 发表于 2014-7-25 14:45
三楼的哥们儿说得挺好。实际中,如果你想精确到小数后某一位,比如计价精确到分,那么常用的方法就是乘以10 ...

原来这样。
回复 使用道具 举报
double类型不是精确存储,而是科学计数法的方式存储。
double大小为8字节,内存中的存储方式如下:
符号位(1bit)指数(11bit)尾数(52bit)。
你想做小数的加法,并且保留确定位数的小数,三楼提供的方法最常用。
回复 使用道具 举报
看看         
回复 使用道具 举报
思维 高级黑马 2014-7-25 21:00:10
9#
http://bbs.itheima.com/thread-131976-1-1.html我的帖子里面有这个解答!
回复 使用道具 举报
jwx555 中级黑马 2014-7-25 17:38:49
8#
怀念黑海岸 发表于 2014-7-25 15:37
个人认为是系统为了提高精度而产生这样子的结果,如果要获得想要的结果只需输出System.out.println(((flo ...

float?

float 0.01+0.04 你再试试
回复 使用道具 举报
  个人认为是系统为了提高精度而产生这样子的结果,如果要获得想要的结果只需输出System.out.println(((float)(a+b)));降低对精度的需求即可。
回复 使用道具 举报
我试过了     要想输出0.1

double a = 0.01 ;
double b = 0.09 ;

System.out.println((a*100+b*100)/100) ;这样写就对了
回复 使用道具 举报
三楼的哥们儿说得挺好。实际中,如果你想精确到小数后某一位,比如计价精确到分,那么常用的方法就是乘以10的倍数化为整数后进行存储和运算,需要输出时再转为小数。
回复 使用道具 举报
这样写就可以   System.out.println(0.01f+0.09f);
回复 使用道具 举报
(a*100+b*100)/100
回复 使用道具 举报
小数是一个无穷大 接近  他的数,而不是一个准确的数
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马