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,这是怎么回事?
展开
 我来答
samismiling
推荐于2017-10-09 · 知道合伙人软件行家
samismiling
知道合伙人软件行家
采纳数:1340 获赞数:5604

向TA提问 私信TA
展开全部
我想你说的是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());
唯爱多啦梦cQb8a
推荐于2017-09-08 · TA获得超过639个赞
知道小有建树答主
回答量:746
采纳率:0%
帮助的人:535万
展开全部
目前常用的float和double等浮点数是基于IEEE-754的二进制有限小数。一个有理数,除非分母是足够小的2的整数次幂,否则它就不能被精确表示。因此,有些十进制有限位数的小数,到二进制里面可能会变成无限循环小数,在浮点数中不能表示而损失精度。
追问
这么说来用float和double进行运算都可能存在问题了
追答
一般是double比较精确一些
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
习惯自己丶
2012-11-28 · 超过36用户采纳过TA的回答
知道小有建树答主
回答量:116
采纳率:0%
帮助的人:53.4万
展开全部
想要精确要自己转成字符串对应位相加
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
往翼已离夜
2012-11-28 · TA获得超过176个赞
知道小有建树答主
回答量:552
采纳率:85%
帮助的人:106万
展开全部
float 和double 2进制 可以变个方式测试一下
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式