使用java在浮点值中丢失精度

use*_*253 3 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();
        }
    }
Run Code Online (Sandbox Code Playgroud)

输出:

    Number value    : 676543.21
    float value     : 676543.2
    Float.MAX_VALUE : 3.4028235E38
    Is floatVal > Float.MAX_VALUE ? false
Run Code Online (Sandbox Code Playgroud)

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

Tas*_*kos 21

floats通常最多可达6位有效数字.您的电话号码是676543.218位有效数字.您看到超过6位数的错误,并且您执行的计算越多,这些错误将很容易传播到更有效的数字.如果你重视自己的理智(或精确度),请使用doubles.浮标甚至不能准确计算超过1000万.

现在,您有2位有效数字,这表明您有可能想要代表货币 - 请勿.使用您自己的类,使用定点算法在内部表示值.

现在,至于Float.MAX_VAL哪个是3.4028235E38,意思是3.4028235*10 ^ 38,这比你的值大约10 ^ 32倍.注意那里的'E'?这是指数.


Sha*_*ark 8

我爱这些.但我会快速无痛地做到这一点.

浮点数和小数(也称为浮点数)也不会精确保存在内存中.但是我不想在这里考虑浮动精度与精度问题,我只想指出一个链接 - http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm

至于你的另一个问题,lemme就是这样说的,因为花车以科学记数法存储.

floatVal = 6.765432E6 = 6.7 * 10^6
MAX_VALUE = 3.4E38 = 3.4 * 10^38
Run Code Online (Sandbox Code Playgroud)

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

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

比较浮点数时尝试使用小三角洲.也许这个链接可以帮助你http://introcs.cs.princeton.edu/java/91float/


Pet*_*rey 7

所有数据类型都有表示限制,因此存在限制的事实不应该令人惊讶.

float使用24位作为其"尾数",其中包含所有有效数字.这意味着它有大约7位精度(因为2 ^^ 24大约是1600万)

double 它使用53位的"尾数",因此它可以精确地保持大约16位数.