【问题标题】:different values for float and doublefloat 和 double 的不同值
【发布时间】:2012-07-20 14:25:58
【问题描述】:

我不明白为什么浮点值与双精度值不同。从下面的例子可以看出,对于相同的操作,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 之间的区别吗?

【问题讨论】:

标签: java


【解决方案1】:
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 位小数。

【讨论】:

    【解决方案2】:

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

    double 是 64 位 IEEE 754 浮点数。

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

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

    【讨论】:

      【解决方案3】:

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

      当然。假设您有两种 decimal 类型,一种有 5 个有效数字,另一种有 10 个。

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

      floatdouble 相同 - 都是二进制浮点类型,但 doublefloat 具有更高的精度。

      【讨论】:

      • +1 更好的例子; one with 6 significant digits and one with 16 ;)
      【解决方案4】:

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

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

      【讨论】:

      • Java 中的 +1 float 始终为 32 位,double 始终为 64 位。
      【解决方案5】:

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

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

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

      【讨论】:

      • 不是“一半”——float 只有 23 位精度,double 有 52 位。尾数大小与整体大小不成正比。
      猜你喜欢
      • 2013-12-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-17
      • 1970-01-01
      相关资源
      最近更新 更多