黑马程序员技术交流社区

标题: 关于float和double的问题 [打印本页]

作者: 高欢欢    时间: 2012-7-16 12:40
标题: 关于float和double的问题
本帖最后由 高欢欢 于 2012-7-18 07:29 编辑

public class FirstSample
{
public static void main(String[] args)
{
float xx = (2.0F-1.1F);
double yy = (2.0-1.1);
System.out.println(xx+" "+yy);
System.out.println(xx<0 ? yy : xx);
}
}
为什么xx和yy值不一样? xx值后面不会带有多个9?  第二个输出的xx值为什么会变了?

作者: 黑马刘涛    时间: 2012-7-16 12:56
本帖最后由 黑马刘涛 于 2012-7-16 13:17 编辑

不必惊讶,Java中浮点数(double、float)的计算就是是非精确计算。原因嘛,你知道数值在计算机中都是表示为二进制补码,一个小数在变为二进制时可能会损失精度,因此这些浮点数再进行运算时还会损失精度。如果需要精确计算,非要用String来够造BigDecimal不可!

  1. BigDecimal b1 = new BigDecimal(Double.toString(2.0));
  2. BigDecimal b2 = new BigDecimal(Double.toString(1.1));
  3. BigDecimal b=b1.substract(b2);
  4. System.out.println(b);
复制代码
浮点数就是这么恶心

作者: 党巾水    时间: 2012-7-16 13:17
浮点数的值是由数学公式计算得到的。其值由指数和尾数组成。损失精度的情况几乎在任何操作系统和编程环境中都会遇到。
float类型的变量只有7位的精度,而double类型的变量有15位的精度
作者: 侯茂绵    时间: 2012-7-16 13:56
float类型和double类型的精度不同

浮点数在转换时会损失精度。。。所以XX值会变化
作者: 李东升    时间: 2012-7-16 14:06
java浮点数使用二进制数据的科学计数法来表示浮点数,因此可能不能精确地表示一个浮点.
xx和yy直不一样是因为double代表双精度浮点数,占8个字节,64位。float只占4个字节,32位。
后面又输出XX跟前面不同,是因为?:是一个三元运算符,经过这个运算符,精度改变了。
  1. float xx = (2.0f-1.1f);
  2. double yy = (2.0-1.1);
  3. System.out.println(xx+" "+yy);
  4. System.out.println( yy > xx);
  5. System.out.println(0>xx ? yy : (float)xx);
复制代码
看看输出了什么;
  1. 0.9 0.8999999999999999
  2. true
  3. 0.8999999761581421
复制代码
我猜测,通过?:运算符,还原了float类型的实际值,比它原本表示的,精确了一点。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2