ToB企服应用市场:ToB评测及商务社交产业平台

标题: Java中浮点数运算存在的精度问题以及办理方法 [打印本页]

作者: 缠丝猫    时间: 2024-9-27 19:43
标题: Java中浮点数运算存在的精度问题以及办理方法
观察以下一段代码,相信小朋友都可以一眼看出答案,但是计算机给出的答案是这样吗?
public class TestDouble {
public static void main(String args[]) {
System.out.println("0.05 + 0.01 = " + (0.05 + 0.01));
System.out.println("1.0 - 0.42 = " + (1.0 - 0.42));
System.out.println("4.015 * 100 = " + (4.015 * 100));
System.out.println("123.3 / 100 = " + (123.3 / 100));
}
}
完备运行结果:

想不到吧,最后的运行结果居然是这样一堆奇奇怪怪的小数
解答:这是因为因为浮点数在计算机内部是以二进制形式存储的,某些十进制小数无法精确体现。因此,直接运算可能会导致不精确的结果。
办理方法
这里给出三种简单的处理方法
方法一:四舍五入
使用Math.round()对结果进行四舍五入
以上述代码为例进行修改:
public class TestDouble {     public static void main(String args[]) {         System.out.println("0.05 + 0.01 = " + Math.round((0.05 + 0.01)*100.0)/100.0);         System.out.println("1.0 - 0.42 = " + Math.round((1.0 - 0.42)*100.0)/100.0);         System.out.println("4.015 * 100 = " + Math.round((4.015 * 100)*100.0)/100.0);         System.out.println("123.3 / 100 = " + Math.round((123.3 / 100)*1000.0)/1000.0);     } }
结果如下图:

注意:直接使用Math.round时只保存整数
方法二:使用BigDecimal 类
`import java.math.BigDecimal;
import java.math.RoundingMode;
  1. public class BigDecimalRoundExample {
  2.     public static void main(String[] args) {
  3.         double num = 0.5 + 0.1;
  4.         BigDecimal bd = new BigDecimal(Double.toString(num));
  5.         BigDecimal x = bd.setScale(2, RoundingMode.HALF_UP);//2表示要保留的小数位数
  6.         System.out.println(x);
  7.     }
  8. }
复制代码
`
结果:
0.06

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4