黑马程序员技术交流社区
标题:
关于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不可!
BigDecimal b1 = new BigDecimal(Double.toString(2.0));
BigDecimal b2 = new BigDecimal(Double.toString(1.1));
BigDecimal b=b1.substract(b2);
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跟前面不同,是因为?:是一个三元运算符,经过这个运算符,精度改变了。
float xx = (2.0f-1.1f);
double yy = (2.0-1.1);
System.out.println(xx+" "+yy);
System.out.println( yy > xx);
System.out.println(0>xx ? yy : (float)xx);
复制代码
看看输出了什么;
0.9 0.8999999999999999
true
0.8999999761581421
复制代码
我猜测,通过?:运算符,还原了float类型的实际值,比它原本表示的,精确了一点。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2