float和double的不同值

时间:2012-07-20 14:25:59

标签: java

我不明白为什么浮点值与double值不同。从下面的示例可以看出,对于相同的操作,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

你能解释浮动和双重之间的区别吗?

5 个答案:

答案 0 :(得分:24)

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

double是64位IEEE 754浮点。

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

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

答案 1 :(得分:14)

  

你能解释浮动和双重之间的区别吗?

不确定。想象一下,你有两个十进制类型,一个有五位有效数字,一个有十位数。

您将使用什么价值来表示每种类型的pi?在这两种情况下,你都试图接近一个你无法代表完全的数字 - 但你不会得到相同的价值,不是吗?

floatdouble也是如此 - 两者都是二进制浮点类型,但double的精度高于float

答案 2 :(得分:11)

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位小数。双精度数可以处理大约16位小数。

答案 3 :(得分:5)

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

浮点数(通常)为32位,双64位(通常为)。因此浮点数的数量多于双数的舍入误差。

答案 4 :(得分:1)

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

它大约只有一半 - 23位,而52则是双倍(非常感谢Skeet先生!)!

32-bit for floats, 64-bit for doubles. ...请记住,“float”这个词的字母数少于“double”,这是一个“记忆”技巧:)