为了账号安全,请及时绑定邮箱和手机立即绑定

java浮点数精度问题

java浮点数精度问题

梵蒂冈之花 2019-04-16 20:27:47
最近在做一个交易机器人,处理精度问题,发现:Float.parseFloat(Strings);BigDecimal.floatValue();如上两个方法都会产生精度丢失问题。那么浮点数只能用string才能精确表示吗,真蛋疼。float和double类型不就多余了?
查看完整描述

1 回答

?
蝴蝶不菲

TA贡献1810条经验 获得超4个赞

接@justjavac大神的答案
有个问题,Strings="0.12";调用Float.parseFloat(s);返回的结果偶尔会是0.1199
按道理0.12float类型完全可以表示的啊
这道理从何而来?凭空想象的吧
计算机存储任何数字都是基于二进制,那么浮点数怎么存储成二进制?这里Java遵循了IEEE754标准,大致过程如下
十进制数字转化成二进制表示形式,通过将整数部分除2取余、小数部分乘2取整来完成转换
0.12=>0.00011110101110000101000111101...
//发现了么?十进制的有穷小数,在二进制中,变成了无穷
//只有小数部分*2^n==1的情况,用二进制表示才是有穷的
转换成科学计数法(二进制下),将小数点移动到第一个1的右边
0.00011110101110000101000111101...=>1.1110101110000101000111101...*2^-4
结果显而易见了,转换成IEEE754形式
18位23位存不下了
00111101111101011100001010001111(01...)
+2的-4次幂除去整数部分1之后剩余的尾数0舍1入后忽略这部分,精度就这样没了
当你再从2进制转换回10进制时,失去的部分就回不来了
1.1110.....1(?...)
1*2^0+1*2^-1+1*2^-2+1*2^-3+0*2^-1+...+1*2^-23+???
                            
查看完整回答
反对 回复 2019-04-16
  • 1 回答
  • 0 关注
  • 425 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号