java - 使用java的浮点值精度丢失

标签 java floating-point

下面给出了测试代码及其输出。当我从数字值中获取浮点值时,精度会丢失。谁能告诉我为什么会出现这种行为以及如何处理这种情况?

public static void main(String[] args)
    {
        try
        {
            java.lang.Number numberVal = 676543.21;
            float floatVal = numberVal.floatValue();
            System.out.println("Number value    : " + numberVal);
            System.out.println("float value     : " + floatVal);
            System.out.println("Float.MAX_VALUE : " + Float.MAX_VALUE);
            System.out.println("Is floatVal > Float.MAX_VALUE ? " + ( floatVal > Float.MAX_VALUE));
        }catch(Exception e)
        {
            e.printStackTrace();
        }
    }

输出:

    Number value    : 676543.21
    float value     : 676543.2
    Float.MAX_VALUE : 3.4028235E38
    Is floatVal > Float.MAX_VALUE ? false

还有为什么浮点值小于 Float.MAX_VALUE?

最佳答案

float 通常最多 6 位有效数字。您的电话号码是 676543.21,它有 8 位有效数字。您看到超过 6 位的错误,并且您执行的计算越多,这些错误将很容易传播到更多有效数字。如果您重视您的理智(或精确度),请使用 double。 float 甚至不能准确地数过 1000 万。

现在,您有 2 位有效数字,这对我来说表明您有可能想要表示货币 - 请勿。使用您自己的类,该类在内部使用定点算术表示值。

现在,关于 Float.MAX_VAL,它是 3.4028235E38,意思是 3.4028235*10^38,大约是您的值的 10^32 倍。注意到里面的“E”了吗?这是指数。

关于java - 使用java的浮点值精度丢失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11825719/

相关文章:

java - 使用 Java 运行 .reg 文件

java - 如何通过序列化在 Intent 之间传递自定义 ArrayAdapter 对象

c - OpenGL:指定 UV 坐标时如何避免舍入错误

c++ - 可以在没有 epsilon 的情况下将 float 与 0.0 进行比较吗?

c - MPIR 的浮点类型不准确吗?

java - Eclipse - 包含选择而不是替换

java - 基于 SQLite 数据库数据创建带有文本和 Collection 夹图标的 ListView

java - 如何以编程方式检查页面的 url 是否正在重定向?

java - 在JAVA中,可以使用大数小数来进行 float 和 double 的减法

python - 得到除法后的所有小数位