float有很大的问题! 几千个浮点数相加,误差竟然达到10左右!用不同的顺序加,误差能达到2!太让人失望了! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 一般都是用BigDecimal处理精确计算的,但Java的float还是太离谱了,不知道Sun为什么要这样做? 竟有这事?举个例子?几千个数,是数据库中的,我用sum求和的结果与用double的差不多,但跟用float的相差太多,一开始还以为是程序有问题,后来才发现是float的问题! http://www-128.ibm.com/developerworks/cn/java/j-jtp0114/index.html 一般情况下,精确计算处理 ,是用BigDecimal 我知道用BigDecimal可能得到精确的结果,但是我不需要太精确的结果!我知道float有误差,但是不知道有这么大的误差!为什么别的语言32位的浮点数没有这么大的误差? 如果java有这些误差,其他语言也应该有这些误差,误差是一样的。 请仔细看javadoc,java中的float类型是遵照IEEE754标准进行设计的。误差的出现是正常的,其本身并不是由java本身所决定,只要是遵照标准进行设计,就会有误差。精度计算请使用java.math.BigDecimal 你要是用int来处理,误差更大。每一种类型都有一定的作用范围,没什么好奇怪的。 不是float的问题,是你的使用问题.float的精度很小int i=100000001;float f=i; //自动转换,精度丢失.int num=(int)f;num现在的值是10000000;//最后一位丢失 出现上述情况是很正常的,凡是浮点数都有有误差的要记住float虽然比long的表示范围广,但是float无法正确的表示一个int类型! 你使用double就会好一些啦,为什么非得用float不过即使使用double也会出现误差,这个是没有办法的,因为毕竟精度有限 误差与java和sun无关其实,产生误差是必然的,int和float都是32位的,也就是说,都可以精确表示2^32次方的精确数据,由于int是整形,在其最大最小值范围内,都是100%精确的。而浮点型表示的是小数,而在最大,最小值范围内,小数的个数是无穷的,用有限个精确值来表示无穷多种可能,当然是极不精确(夸张点讲,如果精确度定义成精确值个数与所有可能表示的个数之比的话,这个“精确度”就是0)。而且,为了让常用的数值尽可能精确,相邻两个浮点数的精确值,在0附近比较密集(但不知道是不是正态分布),如果浮点数比较大的话,相邻两个精确值之间跨度超过几千是很正常的。 刚才试了一下,最大的float和它最接近的那个精确值之间竟然相差了2.028241E31,如果是double的话,这个最大跨度竟然达1.9958403095347198E292 public static void main(String[] args) throws Exception { int maxFloatBits = Float.floatToIntBits(Float.MAX_VALUE); int closestFloatBits = maxFloatBits - 1; float closestFloat = Float.intBitsToFloat(closestFloatBits); System.out.println(Float.MAX_VALUE); System.out.println(closestFloat); System.out.println(Float.MAX_VALUE - closestFloat); long maxDoubleBits = Double.doubleToLongBits(Double.MAX_VALUE); long closestDoubleBits = maxDoubleBits - 1; double closestDouble = Double.longBitsToDouble(closestDoubleBits); System.out.println(Double.MAX_VALUE); System.out.println(closestDouble); System.out.println(Double.MAX_VALUE - closestDouble); } 用法没有问题,自始至终都是用的float,没有别的类型 用double吧,在一定范围内计算的结果还是正确的 我用了double,结果还算是能接受的我是想知道是float的问题还是java的问题? 不是java的问题,是float本身的问题(IEEE标准) applet第三方jar包问题 弱弱的想请问一下有关io流的。。 初学者求教 java做局域网聊天工具 java中null的使用问题 分布式垃圾回收~~~ 请帮帮我这个门外汉!(在线等待!!) JDBC、reflect调用时候的费解事情,关于object的argument type mismatch 共200分的贴:http://expert.csdn.net/Expert/topic/1725/1725556.xml?temp=.6958734 一个小问题:java bean 组件模型与CORBA 组件模型有什么区别? 数据库连接问题(困扰我好久了) 请问一道面试题的执行过程,分问没了
处理精确计算的,但Java的float还是太离谱了,不知道Sun为什么要这样做?
几千个数,是数据库中的,我用sum求和的结果与用double的差不多,但跟用float的相差太多,一开始还以为是程序有问题,后来才发现是float的问题!
我知道float有误差,但是不知道有这么大的误差!
为什么别的语言32位的浮点数没有这么大的误差?
误差的出现是正常的,其本身并不是由java本身所决定,只要是遵照标准进行设计,就会有误差。精度计算请使用java.math.BigDecimal
float的精度很小
int i=100000001;
float f=i; //自动转换,精度丢失.
int num=(int)f;
num现在的值是10000000;//最后一位丢失
要记住float虽然比long的表示范围广,但是float无法正确的表示一个int类型!
如果是double的话,这个最大跨度竟然达1.9958403095347198E292
int maxFloatBits = Float.floatToIntBits(Float.MAX_VALUE);
int closestFloatBits = maxFloatBits - 1;
float closestFloat = Float.intBitsToFloat(closestFloatBits);
System.out.println(Float.MAX_VALUE);
System.out.println(closestFloat);
System.out.println(Float.MAX_VALUE - closestFloat);
long maxDoubleBits = Double.doubleToLongBits(Double.MAX_VALUE);
long closestDoubleBits = maxDoubleBits - 1;
double closestDouble = Double.longBitsToDouble(closestDoubleBits);
System.out.println(Double.MAX_VALUE);
System.out.println(closestDouble);
System.out.println(Double.MAX_VALUE - closestDouble);
}
我是想知道是float的问题还是java的问题?