float类型计算的问题

RR_FF 2011-08-04 12:21:20
定义了两个float类型的数据a,5.1要减去整型int b,b=5;a-b=????结果为甚么不是0.1而是0.09999999999999;如果我要让结果为0.1该怎么办?
...全文
471 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
风尘中国 2011-08-04
  • 打赏
  • 举报
回复
第一点,你要明确java里面32位的float对0.1在内存当中的表示是不精确的,不是你理解的那么100%精确,抛弃这个概念,产生这个误差的原因简单理解在32位的float的表达能力有限和计算机的二进制缘故吧,往下说也很复杂。
大体说下,float的0.1二进制形式是001111011 10011001100110011001101,根据符号位换算为10进制表达的值精确应该是这样计算 110011001100110011001101乘以2的负27次方,实际值是0.100000001490116119384765625
这样就产生了实际误差
这个误差对我们生活小打小闹没啥影响,但是对科学计算和银行这样的应用或者领域是致命的,因此要用Java银行以及科学计算会用java.math.BigDecimal提高精度,否则后果极其严重。
小赖赖 2011-08-04
  • 打赏
  • 举报
回复
因为float型,double型在计算机中是按照2进制存储的,且精度有限
在二进制和十进制转换中,就会出现当前精度无法严格转换的问题
就会发生四舍五入,产生误差
飞跃颠峰 2011-08-04
  • 打赏
  • 举报
回复
float,double都是不精确的,只是近似
所以这个结果在Java中是正常的
要精确可以用BigDecimal
24K純帥 2011-08-04
  • 打赏
  • 举报
回复
恩,1L说的不错。。是不精确~
iis81365341 2011-08-04
  • 打赏
  • 举报
回复
如1楼和2楼所说,这是精度问题。如果对精度要求不高可以如下做简单处理:
double d = Double.parseDouble(new DecimalFormat("0.00").format(a-b));
System.out.println(d);
shine333 2011-08-04
  • 打赏
  • 举报
回复
精确计算用BigDecimal,另外,如果小数位数有限而且固定的话,在有效范围内,还可以用int/long来替代float/double

举例:
1.23m = 123cm = 1230mm
4.56元 = 123分
7.89kg = 7890g
RR_FF 2011-08-04
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 ioe_gaoyong 的回复:]
第一点,你要明确java里面32位的float对0.1在内存当中的表示是不精确的,不是你理解的那么100%精确,抛弃这个概念,产生这个误差的原因简单理解在32位的float的表达能力有限和计算机的二进制缘故吧,往下说也很复杂。
大体说下,float的0.1二进制形式是001111011 10011001100110011001101,根据符号位换算为10进制表达的值精确应该是这样计算 11001……
[/Quote]
BigDecimal这个数能不能和Int型数进行运算?
RR_FF 2011-08-04
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 iis81365341 的回复:]
如1楼和2楼所说,这是精度问题。如果对精度要求不高可以如下做简单处理:

Java code

double d = Double.parseDouble(new DecimalFormat("0.00").format(a-b));
System.out.println(d);
[/Quote]
这个数能和int 类型的数进行运算吗?
RR_FF 2011-08-04
  • 打赏
  • 举报
回复
谢谢大侠!

62,635

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧