非常小的简单精度和双精度浮点数表示

时间:2015-04-14 10:50:25

标签: java floating-point numbers representation

当我试图计算一些非常小的简单精度和双精度浮点数时,我遇到了一些问题。

查看以下代码示例:

public class FloatingLimits {

    public static void doSimpleFloatingLimitDemo() {
        float firstValue = 1.56F;
        float newValue = 1.0F / ((float)Math.pow(2.0D, 150));

        double doubleFirst = 2.56;
        double doubleNew = 1.0F /Math.pow(2.0D, 150);
        double doubleThird = 1.0F/Math.pow(2.0D, 589);
        double doubleFourth = 1.0F/Math.pow(2.0, 1589);

        System.out.println("float first value =" + firstValue);
        System.out.println("float new value =" + newValue);

        System.out.println("double first value =" + doubleFirst);
        System.out.println("double new value =" + doubleNew);
        System.out.println("double third value =" + doubleThird);
        System.out.println("double fourth value =" + doubleFourth);

    }


    public static void main(String[] args) {
        doSimpleFloatingLimitDemo();

    }
}

它产生以下结果:

small numbers issue

因此存在代表问题或显示问题!这与数字精度有关吗?使用简单浮点精度类型(32位)无法表示的非常小的数字可以用双浮点精度数(64)位表示,但双浮点数也显示限制。那么对于非常小的数字,这个限制是什么?是否有使用float和double数字的解决方法,或者我是否必须使用BigDecimal来解决它。如果我必须使用BigDecimals,BigDecimal表示是否也有一定的限制?

2 个答案:

答案 0 :(得分:2)

如果你看Double.MAX_VALUE

  

一个常数,它保持double类型的最大正有限值,(2-2 -52 )。2 1023

如果你跑:

System.out.println(Math.pow(2.0, 1589));

您将看到预期的结果:

  

无限

答案 1 :(得分:1)

如果您需要以任意精度表示十进制数,则必须使用BigDecimal

这是一个链接

http://docs.oracle.com/javase/7/docs/api/java/math/BigDecimal.html

float和double的内部二进制表示可能会引入错误。另一种可能性是使用intlong将值乘以因子(10,100,1000 ...)并将它们视为非十进制值。