黑马程序员技术交流社区
标题:
发现一个有意思的问题:double 计算
[打印本页]
作者:
李亚飞
时间:
2012-12-18 17:46
标题:
发现一个有意思的问题:double 计算
本帖最后由 李亚飞 于 2012-12-19 10:21 编辑
package com.String;
public class StringText {
/**
* 发现一个有意思的问题:double 计算: 2.00 - 1.10
* 结果是:0.8999999999999999
* 谁知道为什么?
*/
public static void main(String[] args) {
System.out.println(2.00 - 1.10);
}
}
作者:
孙辉辉
时间:
2012-12-18 18:01
本帖最后由 孙辉辉 于 2012-12-18 18:02 编辑
其实这个和1=0.9999999999一个意思,自己换算下就知道,0.9换算成二进制是个无限循环小数。要用有限的位数表示它是不可能的,只能取近似值。由于计算机硬件取近似值时用的是去尾法,取得的近似值会略小于真值。因此得到的结果就是0.89999999999。
结论是:在需要精确答案的地方,要避免使用float和double;对于货币计算,要使用int、long或BigDecimal。
作者:
依然AI
时间:
2012-12-18 18:12
本帖最后由 依然AI 于 2012-12-18 18:16 编辑
出现这种问题的原因是浮点数值是采用二进制系统表示的,而在系统中无法精确的表示分数1/10。
需要在计算中不含有任何舍入误差,就应该使用BigDecimal类。
将一个类标记为strictfp ,那么这个类中的所有方法都要使用严格的浮点数计算,
将一个方法标记为strictfp,那么这个方法就会使用严格的浮点数计算,
public static strictfp void main(String [] args)
有种简单的方法 可以先乘 去掉小数点 做运算然后再除 可以避免 浮点运算
作者:
yuchen208
时间:
2012-12-18 18:48
double二进制转换进度不高,
使用BigDecimal这个精度高
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2