java - 非常小的简单精度和 double float 表示

标签 java floating-point numbers representation

当我尝试计算一些非常小的简单精度和 double float 时,我遇到了一些问题。

看一下下面的代码示例:

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 表示也有一定的限制吗?

最佳答案

如果你看Double.MAX_VALUE

A constant holding the largest positive finite value of type double, (2-2-52).21023.

如果你运行:

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

您将看到预期的结果:

Infinity

关于java - 非常小的简单精度和 double float 表示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29625460/

相关文章:

java - 如果测试失败,则重试 TestNG 代码中的特定代码段,而不是整个测试

Java数组递归

c++ - 将 4 个原始字节转换为 32 位 float

javascript - Parseint——用 e+ chop

delphi - Delphi XE8 中的数字分区算法生成器

java - 无法从招摇中下载文件

java.lang.IllegalArgumentException : Could not resolve property name hourtoreserve from Property set for bean com. ti.project.vaadin.vaadinprojectti.Day

string - 在 Perl 中如何将字符串转换为数字?

C浮点变量不存储小数

php - 使用 PHP 将数字缩写(5.2k、1.7m 等)转换为有效整数