100 * 5.11 = 511.00000000000006 搜索 IEEE 754使用 java.math.BigDecimal 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 DecimalFormat df = new DecimalFormat("####.##");100*5.11:5.11是double类型的,计算后的结果也是double类型,根据你想要的格式用上面的代码格式化一下,然后转换成你想要的类型,如果想要int型的就直接强转一下。如用下面的代码转换成两位float类型的结果。Float y = Float.parseFloat(df.format(y)); 浮点数计算不是完全精确的,可以对计算结果取指定精确度后的值,方法很多,google下吧。 给5.11 先扩大100倍,计算完再把拿100倍拿掉。float,double在java中存储会有误差,计算的结果也就有一点点偏差了。 Java中浮点数的精度问题当您在计算Money的时候,请看好了!!!要不损失了别后悔!!!现象1: public static void main(String[] args) { System.out.println(0.030*100);//输出3.0 System.out.println(0.031*100);//输出3.1 System.out.println(0.032*100);//输出3.2 System.out.println(0.033*100);//输出3.3000000000000003 System.out.println(0.034*100);//输出3.4000000000000004 System.out.println(0.035*100);//输出3.5000000000000004 System.out.println(0.036*100);//输出3.5999999999999996 System.out.println(0.037*100);//输出3.6999999999999997 System.out.println(0.038*100);//输出3.8 System.out.println(0.039*100);//输出3.9 }现象2: public static void main(String[] args) { BigDecimal b1 = new BigDecimal("0.236"); BigDecimal b2 = new BigDecimal(0.236); System.out.println(b1);//输出0.236 System.out.println(b2);//输出0.2359999999999999875655021241982467472553253173828125}描述:当我们使用一些“特殊的数字”进行运算时,或者调用BigDecimal中new BigDecimal(double val)进行构造的时候,将得到意想不到的结果。原因:Java中,浮点类型是依据IEEE754标准的。IEEE754定义了32位和64位双精度两种浮点二进制小数标准。采用二进制表示double,float等浮点数是不准确的。同时BigDecimal的API声明,建议使用new BigDecimal(String val)进行构造,使用new BigDecimal(double val)进行构造的时候,将得到意想不到的结果(The results of this constructor can be somewhat unpredictable)。解决办法(以0.236*100 = 23.599999999999998为例):1、 通过String结合BigDecimal来转换。 String val = "0.236"; //使用new BigDecimal(String val)进行构造 BigDecimal a = new BigDecimal(""+val); BigDecimal b = new BigDecimal(""+100); //小数的位数与构造参数的位数一致 System.out.println(a.multiply(b));//输出23.6002、 通过移位结合BigDecimal来转换 String val = "0.236"; //使用new BigDecimal(String val)进行构造 BigDecimal a = new BigDecimal(""+val); //向右移两位 a = a.movePointRight(2); System.out.println(a);//输出23.63、 使用保留小数位的方法来转换 double result = 0.236*100; System.out.println(result);//输出23.599999999999998 //计算保留result小数点后四位,以此类推,1后面几个零就是保留小数点后几位数.如下保留两位小数 result = (double)(Math.round(result*100)/100.0) ; System.out.println(result);//输出23.64、 使用DecimalFormat来确定小数点后位数 double val = 0.236*100; //保留小数点后两位,若保留三位为"#.000" DecimalFormat df = new DecimalFormat("#.00"); String str = df.format(val); System.out.println(Double.valueOf(str));//输出23.65、-----方法很多,一个即可心得:处理这样的精度问题方法很多,只要不是直接采用浮点数进行计算就行。附加:IEEE 754用科学记数法以底数为2的小数来表示浮点数。32位浮点数用1位表示数字的符号,用8位来表示指数,用23位来表示尾数,即小数部分。作为有符号整数的指数可以有正负之分。小数部分用二进制(底数2)小数来表示。对于64位双精度浮点数,用1位表示数字的符号,用11位表示指数,52位表示尾数。如下两个图来表示:float(32位):1位,符号位幂(8位)尾数(32位)double(64位):1位,符号位幂(11位)尾数(52位)都是分为三个部分:(1)一个单独的符号位s直接编码符号s。(2)k位的幂指数E,移码表示。(3)n位的小数,原码表示。 System.out.println((int)5.11*100)这样就可以了。 NetBeans IDE 如何设置主窗体的属性 java中调存储过程和函数时出错!!! 寻找文件夹问题 thinkinjava里的2道题谁会阿 菜鸟求助 大家帮我看看:select @@IDENTITY 取不到刚插入的ID,先谢谢啦。 mysql的查询语句中支持嵌套吗,急! 那里有rational rose 下载阿!!!!! 最简单的问题 jdbc可以访问另一台机器的mysql吗? 初学者 一个问题请教 十分感谢 请教关于NetBean 7的JUnit插件问题,谢谢!
100*5.11:5.11是double类型的,计算后的结果也是double类型,根据你想要的格式用上面的代码格式化一下,然后转换成你想要的类型,如果想要int型的就直接强转一下。如用下面的代码转换成两位float类型的结果。
Float y = Float.parseFloat(df.format(y));
当您在计算Money的时候,请看好了!!!要不损失了别后悔!!!现象1: public static void main(String[] args) { System.out.println(0.030*100);//输出3.0 System.out.println(0.031*100);//输出3.1 System.out.println(0.032*100);//输出3.2 System.out.println(0.033*100);//输出3.3000000000000003 System.out.println(0.034*100);//输出3.4000000000000004 System.out.println(0.035*100);//输出3.5000000000000004 System.out.println(0.036*100);//输出3.5999999999999996 System.out.println(0.037*100);//输出3.6999999999999997 System.out.println(0.038*100);//输出3.8 System.out.println(0.039*100);//输出3.9 }现象2: public static void main(String[] args) { BigDecimal b1 = new BigDecimal("0.236"); BigDecimal b2 = new BigDecimal(0.236); System.out.println(b1);//输出0.236 System.out.println(b2);//输出0.2359999999999999875655021241982467472553253173828125}描述:当我们使用一些“特殊的数字”进行运算时,或者调用BigDecimal中new BigDecimal(double val)进行构造的时候,将得到意想不到的结果。原因:Java中,浮点类型是依据IEEE754标准的。IEEE754定义了32位和64位双精度两种浮点二进制小数标准。采用二进制表示double,float等浮点数是不准确的。同时BigDecimal的API声明,建议使用new BigDecimal(String val)进行构造,使用new BigDecimal(double val)进行构造的时候,将得到意想不到的结果(The results of this constructor can be somewhat unpredictable)。解决办法(以0.236*100 = 23.599999999999998为例):1、 通过String结合BigDecimal来转换。 String val = "0.236"; //使用new BigDecimal(String val)进行构造 BigDecimal a = new BigDecimal(""+val); BigDecimal b = new BigDecimal(""+100); //小数的位数与构造参数的位数一致 System.out.println(a.multiply(b));//输出23.6002、 通过移位结合BigDecimal来转换 String val = "0.236"; //使用new BigDecimal(String val)进行构造 BigDecimal a = new BigDecimal(""+val); //向右移两位 a = a.movePointRight(2); System.out.println(a);//输出23.63、 使用保留小数位的方法来转换 double result = 0.236*100; System.out.println(result);//输出23.599999999999998 //计算保留result小数点后四位,以此类推,1后面几个零就是保留小数点后几位数.如下保留两位小数 result = (double)(Math.round(result*100)/100.0) ; System.out.println(result);//输出23.64、 使用DecimalFormat来确定小数点后位数 double val = 0.236*100; //保留小数点后两位,若保留三位为"#.000" DecimalFormat df = new DecimalFormat("#.00"); String str = df.format(val); System.out.println(Double.valueOf(str));//输出23.65、-----方法很多,一个即可心得:处理这样的精度问题方法很多,只要不是直接采用浮点数进行计算就行。附加:IEEE 754用科学记数法以底数为2的小数来表示浮点数。32位浮点数用1位表示数字的符号,用8位来表示指数,用23位来表示尾数,即小数部分。作为有符号整数的指数可以有正负之分。小数部分用二进制(底数2)小数来表示。对于64位双精度浮点数,用1位表示数字的符号,用11位表示指数,52位表示尾数。如下两个图来表示:float(32位):1位,符号位幂(8位)尾数(32位)double(64位):1位,符号位幂(11位)尾数(52位)都是分为三个部分:(1)一个单独的符号位s直接编码符号s。(2)k位的幂指数E,移码表示。(3)n位的小数,原码表示。