你所不知道的JAVA浮点数运算

你所不知道的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

所以,我错了,我还是太年轻了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章