你所不知道的JAVA浮点数运算
项目中遇到一个奇怪的问题,大家都知道JAVA中的浮点数,但是浮点数的运算我估计谁都没有深究。
下面先把问题抛出来,假如我想把一个为“32.33”的float类型浮点数转成String,如何处理?
很多人会说,So easy!!我给你列出几种方法:
float v = 326666.43f;
System.out.println("" + v);
System.out.println(String.valueOf(v));
System.out.println(Float.toString(v));
你以为这样可行吗?其实运行一下,结果是:
326666.44
326666.44
326666.44
然后,你可能会说,真是小学生,不知道浮点运算要用BigDecimal吗!!
于是改成如下:
BigDecimal decimal = new BigDecimal(v);
System.out.println(decimal.toString());
那么运行结果是什么呢?看看吧:
326666.4375
后面多了两位是吧,那是不是要加上小数位限制,但是你想,如果加上小数位限制,是不是要四舍五入,一旦你四舍五入,结果是不是还是326666.44!!
好吧,还有一种方法,我们来试一下DecimalFormat,格式化它:
DecimalFormat df = new DecimalFormat("#.##");
System.out.println(df.format(v));
限制两位小数,结果如下:
326666.44
很可惜,还是不行!
其实,浮点数本身就不是精确的,现在我们却要用它进行精确运算,这就必需要用到JDK提供的BigDecimal类,你也许会说,我们上面已经用了这个类了,结果还是不行啊!
不是不行,其实是这样的,上面我们使用BigDecimal时,传入了一个float类型的参数,错就错在这里,JDK中已经明确说明,浮点数作为BigDecimal类的参数时,还是无法得到准确的数据!
JDK建议使用参数类型是String!!!
JDK建议使用参数类型是String!!!
JDK建议使用参数类型是String!!!
改成Stirng参数:
BigDecimal d = new BigDecimal("326666.43");
System.out.println(d.toString());
的结果如下:
326666.43
所以,我错了,我还是太年轻了