float和double的值有何不同?

14

我不明白为什么浮点数值与双精度数值不同。从下面的例子中可以看出,对于相同的运算,float提供了不同的结果:

public class Test {

    public static void main(String[] args) {
        double a = 99999.8d;
        double b = 99999.65d;
        System.out.println(a + b);

        float a2 = 99999.8f;
        float b2 = 99999.65f;
        System.out.println(a2 + b2);
    }
}

输出:

199999.45
199999.44

你能解释一下浮点数和双精度浮点数之间的区别吗?


2
http://en.wikipedia.org/wiki/IEEE_754-1985#Single-precision_32_bit - Damian Leszczyński - Vash
别人已经说了,但在你的特定情况下,结果比浮点数可能具有的有效数字更宽(参见维基百科,7.2个数字)-另请参阅http://en.wikipedia.org/wiki/Single_precision。 - fvu
感谢大家给出的提示,那些维基百科文章很有趣。谢谢! - George D
5个回答

25

浮点数是32位IEEE 754浮点数。

双精度浮点数是64位IEEE 754浮点数。

因为分数部分.8和.65都没有终止的二进制表示,所以这只是一个精度问题,存在一些舍入误差。双精度浮点数有更高的精度,因此它具有稍微较少的舍入误差。

http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html


14
可以解释一下float和double之间的区别吗?
当然,想象一下你有两种十进制类型,一个有五个有效数字,另一个有十个有效数字。
对于这两种类型,你会使用什么值来表示圆周率?在两种情况下,你都会尝试接近一个无法准确表示的数字 - 但你不会得到相同的值,对吧?
同样的道理也适用于float和double——它们都是二进制浮点数类型,但是double比float具有更高的精度。

1
+1 一个更好的例子;一个有6个有效数字和一个有16个有效数字的例子 ;) - Peter Lawrey

12
public class Main {

    public static void main(String[] args) {
        float  a=12.6664287277627762f;
        double b=12.6664287277627762;

        System.out.println(a);
        System.out.println(b);
    }
}

输出:

12.666429
12.666428727762776

float可以处理大约7位小数,double可以处理大约16位小数。


5

双精度浮点数的精度是单精度浮点数的两倍。因此,它们具有更小的舍入误差。

单精度浮点数通常有32位,而双精度浮点数有64位(同样通常)。因此,单精度浮点数在更多数字上存在舍入误差,而双精度浮点数则相对较少。


4
在Java中,+1表示浮点数时始终为32位,表示双精度浮点数时始终为64位。 - Peter Lawrey

1

浮点数比双精度浮点数的精度低。

大约只有一半 - 浮点数为23位,而双精度浮点数为52位(非常感谢Skeet先生!)!

浮点数为32位,双精度浮点数为64位。 ...记住,“float”这个单词比“double”少几个字母,这是一个“记忆”技巧 :)


3
不是“一半”- float 只有23位精度,而 double 有52位。 幂指数的大小并不成比例于整体大小。 - Jon Skeet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接