最近在做一个交易机器人,处理精度问题,发现: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+???
添加回答
举报
0/150
提交
取消
