java中为什么两个浮点数相加结果不符合预期
publicstaticvoidmain(String[]args){floata=646616.1f;floatb=234732.45f;floatc=a+b;Syst...
public static void main(String[] args) {
float a = 646616.1f;
float b = 234732.45f;
float c = a+b;
System.out.println(c);
}
计算结果为881348.56,这是怎么回事? 展开
float a = 646616.1f;
float b = 234732.45f;
float c = a+b;
System.out.println(c);
}
计算结果为881348.56,这是怎么回事? 展开
4个回答
展开全部
我想你说的是java中的浮点数经过计算后,显示的结果是带有很多0的形式吧。这要从浮点数的概念讲起。在Java中float和double类型的数据,无法精确表示计算结果。这是由于float和double是不精确的计算。
例:
System.out.println(0.05+0.01);
System.out.println(1.0-0.42);
System.out.println(4.015*100);
System.out.println(123.3/100);
System.out.println(0.05);
得到如下结果:
0.060000000000000005
0.5800000000000001
401.49999999999994
1.2329999999999999
这是计算机从从本质上讲只能接收1和0,从二进制转为十进制浮点数时,是无论如何也没法精确保存的,因为浮点数实际上只是个近似值。在进行运算后,浮点数的精度就会进一步下降。
要保证精确计算,应使用BigDecimal类。例如
BigDecimal bd3=new BigDecimal(String.valueOf(0.05));
BigDecimal bd4=new BigDecimal(String.valueOf(0.01));
System.out.println((bd3.add(bd4)).doubleValue());
例:
System.out.println(0.05+0.01);
System.out.println(1.0-0.42);
System.out.println(4.015*100);
System.out.println(123.3/100);
System.out.println(0.05);
得到如下结果:
0.060000000000000005
0.5800000000000001
401.49999999999994
1.2329999999999999
这是计算机从从本质上讲只能接收1和0,从二进制转为十进制浮点数时,是无论如何也没法精确保存的,因为浮点数实际上只是个近似值。在进行运算后,浮点数的精度就会进一步下降。
要保证精确计算,应使用BigDecimal类。例如
BigDecimal bd3=new BigDecimal(String.valueOf(0.05));
BigDecimal bd4=new BigDecimal(String.valueOf(0.01));
System.out.println((bd3.add(bd4)).doubleValue());
展开全部
目前常用的float和double等浮点数是基于IEEE-754的二进制有限小数。一个有理数,除非分母是足够小的2的整数次幂,否则它就不能被精确表示。因此,有些十进制有限位数的小数,到二进制里面可能会变成无限循环小数,在浮点数中不能表示而损失精度。
追问
这么说来用float和double进行运算都可能存在问题了
追答
一般是double比较精确一些
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
想要精确要自己转成字符串对应位相加
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
float 和double 2进制 可以变个方式测试一下
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询
广告 您可能关注的内容 |