float乘法异常,求解释。 float fval = 8.9;int amount = 100;fval*amount为什么不是890,而变成了889.9990? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 http://blog.csdn.net/tinasalangane/article/details/7248699 关于精度丢失这里面讲的比较详细 你看一看 float双精度以及double都是会有丢失的具体的涉及到补码和反码什么的,反正我是感觉挺复杂的。。不是高精度的就少用,尽量选择适合的类型就能避免这种问题 float f = 8.9f;int i = 100;BigDecimal b1 = new BigDecimal(f);BigDecimal b2 = new BigDecimal(i);System.out.println(i * f);System.out.println(f * i);System.out.println(b1.multiply(b2).intValue());System.out.println(b1.multiply(b2).setScale(0, BigDecimal.ROUND_HALF_UP));System.out.println(b1.multiply(b2).setScale(1, BigDecimal.ROUND_HALF_UP));System.out.println(b1.multiply(b2).setScale(2, BigDecimal.ROUND_HALF_UP));输出结果:889.99994889.99994889890890.0890.00 这里有详细介绍。 http://www.ibm.com/developerworks/cn/java/j-jtp0114/“浮点运算很少是精确的。虽然一些数字(譬如 0.5 )可以精确地表示为二进制(底数 2)小数(因为 0.5 等于 2 -1),但其它一些数字(譬如 0.1 )就不能精确的表示。因此,浮点运算可能导致舍入误差,产生的结果接近 ― 但不等于 ― 您可能希望的结果。”可以用BIGDECIMAL 但是注意“对于 BigDecimal ,有几个可用的构造函数。其中一个构造函数以双精度浮点数作为输入,另一个以整数和换算因子作为输入,还有一个以小数的 String 表示作为输入。要小心使用 BigDecimal(double) 构造函数,因为如果不了解它,会在计算过程中产生舍入误差。请使用基于整数或 String 的构造函数。”public class TestClass { public static void main(String[] args) throws Exception { BigDecimal f = new BigDecimal("8.9"); BigDecimal a = new BigDecimal(100); System.out.println(f.multiply(a)); }} 都转成统一类型试试,或者使用Bigdecimal 使用double和float类型保存数据本来就是不精确的,如果需要精确计算使用BigDecimal代替 double,float型的加减乘除最好都用Bigdecimal对象来操作. hibrnate4.1.4不能读xml的问题 MyEclipse10下没有Xfire web项目可访问到界面,但是程序不运行 问一个关于JAVA处理XML的问题 为什么我的坦克不能移动? 谁做过医院系统的 请进 有单做!!! 求救:在Jbuilder里能显示,浏览器里却不正常 WEBLOGIC 7.0 中的XML 解析问题! weblogic7JMS开发,两种连接工厂都试了,topic producer已经将消息发布至主题,但同步接收者接受不到,高手请教 ejb-jar.xml的问题 请教下定时从ftp取文件并解析插入数据库的问题 javaScript中$的用法问题
具体的涉及到补码和反码什么的,反正我是感觉挺复杂的。。
不是高精度的就少用,尽量选择适合的类型就能避免这种问题
int i = 100;
BigDecimal b1 = new BigDecimal(f);
BigDecimal b2 = new BigDecimal(i);
System.out.println(i * f);
System.out.println(f * i);
System.out.println(b1.multiply(b2).intValue());
System.out.println(b1.multiply(b2).setScale(0, BigDecimal.ROUND_HALF_UP));
System.out.println(b1.multiply(b2).setScale(1, BigDecimal.ROUND_HALF_UP));
System.out.println(b1.multiply(b2).setScale(2, BigDecimal.ROUND_HALF_UP));
输出结果:
889.99994
889.99994
889
890
890.0
890.00
“浮点运算很少是精确的。虽然一些数字(譬如 0.5 )可以精确地表示为二进制(底数 2)小数(因为 0.5 等于 2 -1),但其它一些数字(譬如 0.1 )就不能精确的表示。因此,浮点运算可能导致舍入误差,产生的结果接近 ― 但不等于 ― 您可能希望的结果。”
可以用BIGDECIMAL 但是注意“对于 BigDecimal ,有几个可用的构造函数。其中一个构造函数以双精度浮点数作为输入,另一个以整数和换算因子作为输入,还有一个以小数的 String 表示作为输入。要小心使用 BigDecimal(double) 构造函数,因为如果不了解它,会在计算过程中产生舍入误差。请使用基于整数或 String 的构造函数。”public class TestClass {
public static void main(String[] args) throws Exception {
BigDecimal f = new BigDecimal("8.9");
BigDecimal a = new BigDecimal(100);
System.out.println(f.multiply(a));
}
}