14

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

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

你能解释一下 float 和 double 之间的区别是什么吗?

4

5 回答 5

25

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

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

所以这只是一个精度问题,因为小数部分 .8 和 .65 都没有终止二进制表示,因此存在一些舍入误差。双精度更高,因此舍入误差略小。

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

于 2012-07-20T14:28:33.353 回答
14

你能解释一下 float 和 double 之间的区别是什么吗?

当然。想象一下,您有两种十进制类型,一种有 5 个有效数字,另一种有 10 个。

您将使用什么值来表示每种类型的 pi?在这两种情况下,您都会尝试尽可能接近无法准确表示的数字- 但您最终不会得到相同的值,对吗?

float和-相同,double都是二进制浮点类型,但doublefloat.

于 2012-07-20T14:36:04.407 回答
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 位小数。

于 2013-02-02T09:42:31.553 回答
5

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

浮点数(通常)具有 32 位和双 64 位(通常也是如此)。因此,浮点数在比双精度数更多的数字上具有舍入误差。

于 2012-07-20T14:27:17.847 回答
1

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

它大约是原来的一半——23 位对双倍的 52 位(非常感谢 Skeet 先生!)!

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

于 2012-07-20T14:30:02.023 回答