当前位置: 首页 > 面试题库 >

使用Java失去浮点值精度

单喜
2023-03-14
问题内容

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

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值小于Float.MAX_VALUE?


问题答案:

我爱这些。但我会使其快速而轻松地进行。

浮点数和小数(也称为浮点数)也不会精确地保留在内存中。但我不想在这里涉及浮点精度与精度问题,我只将您指向一个链接-http: //www.cygnus-
software.com/papers/comparingfloats/comparingfloats.htm

至于您的另一个问题,莱姆说的是这样,因为浮子以科学计数法存储

floatVal = 6.765432E6 = 6.7 * 10^6
MAX_VALUE = 3.4E38 = 3.4 * 10^38

MAX_VALUE比您的浮点数大32个数量级。随时在这里看看http://steve.hollasch.net/cgindex/coding/ieeefloat.html

几个月前,我花了很多时间比较和解决一些FP问题…

比较浮点数时,请尝试使用较小的增量。也许此链接会帮助您http://introcs.cs.princeton.edu/java/91float/



 类似资料:
  • 问题内容: 如何使用正则表达式从字符串中提取双精度值。 问题答案: 这是简单的方法。请勿将regex用于内置类型。

  • 我编写了一个程序来演示Go中的浮点错误: 它打印: 这与用C编写的相同程序的行为相匹配(使用双代码类型) 但是,如果改用,程序就会陷入无限循环!如果将C程序修改为使用而不是,它将打印 为什么在使用时,Go程序的输出与C程序的输出不一样?

  • 问题内容: 如何使用正则表达式从字符串中提取双精度值。 问题答案: 是简单的方法。请勿将regex用于内置类型。

  • 问题内容: 是否有比浮点精度更好的数据类型? 问题答案: 小数数据类型 与基于硬件的二进制浮点数不同,十进制模块具有用户可更改的精度(默认为28位),可以与给定问题所需的精度一样大。 如果您对性能问题感到困扰,请查看GMPY

  • 问题内容: 是否在任何地方都有Java库可以对IEEE 754半精度 数字执行计算或将其与双精度数字进行转换? 这些方法中的任何一种都是合适的: 将数字保持为半精度格式,并使用整数算术和位扭曲(如MicroFloat的单精度和双精度)进行计算 以单精度或双精度执行所有计算,转换成半精度以进行传输(在这种情况下,我需要经过良好测试的转换函数。) 编辑 :转换需要100%准确- 输入文件中 有 很多N