下列表达式中,可以得到精确结果的是()
A.double d1 = 3.0 - 2.6;
B.double d4 = 2.5 * 1.5;
C.double d2 = 30/300;
D. double d3 = 1/2 + 0.5;
请大家选出结果,并说明下原因,多谢
------解决方案--------------------
选b啊。。。
a因为double用二进制计算,因为0.6转换成二进制有精度损失,所以计算结果为0.3999999999999999
c 30/300都是整数 计算起来是0 而你付值给double 就变成了0.0
d1/2=0,然后+0.5就是0.5
------解决方案--------------------
我觉得应该选C吧。因为C是整数。
------解决方案--------------------
这种题目知道了答案有什么意义吗?
------解决方案--------------------
不是说double 计算都会有失精度吗?
这样的话,只能是C啦吧!
------解决方案--------------------
c与d一样,相除的话是都变成0的,
a貌似见过一道题在java puzzle里,不是两位结果
难道选b?
排除法
------解决方案--------------------
因为b的2个数字是.5
计算机不能存小数点,他存的其实是2的多少次方
。5 是2的-1 所以不会丢失精确度,所以a的。6 不行
------解决方案--------------------
个人感觉要用java对double数据的结构来分析,结果是否存在最小精度的问题
------解决方案--------------------
这个很容易解释啊~~0.6换算成二进制是无限循环小数后面是无穷无尽的,而double再长也得有个范围,后面的只能四舍五入,导致了精度的缺失,而1.5和2.5就没有这个问题,1.5的二进制是1.1,2.5的二进制是11.1,所以不存在精度缺失的问题
就像十进制10除以3,是3.333333333一样的道理~
------解决方案--------------------
转一个double处理精度问题的通常方法
使用Java,double 进行运算时,经常出现精度丢失的问题,总是在一个正确的结果左右偏0.0000**1。 特别在实际项目中,通过一个公式校验该值是否大于0,如果大于0我们会做一件事情,小于0我们又处理其他事情。 这样的情况通过double计算出来的结果去和0比较大小,尤其是有小数点的时候,经常会因为精度丢失而导致程序处理流程出错。
所以一般对double类型进行运算时,做好对结果进行处理,然后拿这个值去做其他事情。
/**
* 对double数据进行取精度.
* @param value double数据.
* @param scale 精度位数(保留的小数位数).
* @param roundingMode 精度取值方式.