A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 高欢欢 中级黑马   /  2012-7-16 12:40  /  1513 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 高欢欢 于 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值为什么会变了?

评分

参与人数 1技术分 +1 收起 理由
刘笑 + 1 赞一个!

查看全部评分

4 个回复

正序浏览
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类型的实际值,比它原本表示的,精确了一点。

点评

三元运算符运算后xx值精度降低了吧?  发表于 2012-7-16 16:27

评分

参与人数 1技术分 +1 收起 理由
刘笑 + 1 赞一个!

查看全部评分

回复 使用道具 举报
float类型和double类型的精度不同

浮点数在转换时会损失精度。。。所以XX值会变化
回复 使用道具 举报
浮点数的值是由数学公式计算得到的。其值由指数和尾数组成。损失精度的情况几乎在任何操作系统和编程环境中都会遇到。
float类型的变量只有7位的精度,而double类型的变量有15位的精度
回复 使用道具 举报
本帖最后由 黑马刘涛 于 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);
复制代码
浮点数就是这么恶心

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马