当前位置: 代码迷 >> J2SE >> float转字节数组,再转float精度丢失的有关问题
  详细解决方案

float转字节数组,再转float精度丢失的有关问题

热度:30   发布时间:2016-04-23 20:31:37.0
float转字节数组,再转float精度丢失的问题
碰到一个问题,需要设计二进制协议,float需要转成字节数组,然后再服务器端转成float,现在有这么一个数:
282734.223 转成数组后是:0xC7 0x0D 0x8A 0x48,再转回来变成了 282734.22 小数点2位以后的都没了
282734.2235555 转成数组跟上面结果一样, 转回来都丢失了精度
请教正确的转换姿势
------解决方案--------------------
float类型只有7~8位精度,你把一个超过float精度的数给float时精度就丢失了,并不是在你转换的时候丢失的。
		float f = 282734.2235555f;
System.out.println(f);

上面代码输出282734.22
实际上上面的代码编译的时候就已经丢失精度了,上面编译过后的字节码是
LDC 282734.22
FSTORE 1
可以看到精度已经没了

如果要超过8位精度,请用double,不过double也只有十几位精度,如果还不能满足你的要求,那你只能用BigDecimal了。
------解决方案--------------------
一般解决小数问题如果类型有限制,可以转化为整数,结果再转化为小数
比如:float a=282734.2235555f;
            double b=a*100000000;
传输数据b,接收数据之后再除以100000000,
对于传输数据类型判断,这个就要在协议中加标识了
  相关解决方案