Java 为什么在sysout时浮点值自动递增

Java 为什么在sysout时浮点值自动递增,java,primitive-types,Java,Primitive Types,在我的应用程序中,我使用浮动值来保存客户分数。根据要求,分数前只能有5位小数,分数后只能有3位小数 例如:99999.999 但是,我不理解使用sysout打印浮点值时的奇怪行为 有关更多详细信息,请参阅下面的示例代码: public class Test { public static void main(String[] args) { float f1 = 9999.999f; System.out.println(f1); flo

在我的应用程序中,我使用浮动值来保存客户分数。根据要求,分数前只能有5位小数,分数后只能有3位小数

例如:99999.999

但是,我不理解使用sysout打印浮点值时的奇怪行为

有关更多详细信息,请参阅下面的示例代码:

public class Test {
    public static void main(String[] args) {
        float f1 = 9999.999f;
        System.out.println(f1);

        float f2 = 99999.999f;
        System.out.println(f2);
    }
}
输出为:

9999.999
100000.0
在这里,为什么在使用sysout时,值“99999.999”会自动增加到“100000.0”? 为什么在使用“9999.999”点之前的四位十进制数字的值时没有发生相同的情况


感谢您的建议。

来自java规范:

浮点:浮点数据类型是单精度32位IEEE 754 浮点数。其值的范围超出了本文的范围 讨论,但在浮点类型、格式和 Java语言规范的值部分。就像 对于字节和短字符,建议在以下情况下使用浮点(而不是双精度) 您需要将内存保存在大型浮点数数组中。 此数据类型不应用于精确值,例如 货币。为此,您需要使用java.math.BigDecimal 改为上课。数字和字符串包括BigDecimal和其他有用的 Java平台提供的类

最后,如果您想节省内存而不关心精度,请使用float,否则请使用double。 更多信息请点击这里

我建议使用
并根据您的情况使用该方法。

float
使用24位作为其“尾数”,该尾数包含所有有效数字。这意味着float通常在
7个有效数字以下。您的号码是
99999.999f
,它有
8个有效数字。因此,您将在
7个
数字之后失去精度,并使此类错误超过
7个
数字

如果您尝试放置:
double f2=99999.999


您将得到正确的结果,因为double使用53位的尾数,所以它可以准确地容纳16位左右的数字。

浮点没有那种精度。您的问题是一个浮点可以有多少个小数位,而在进行基数转换时不会丢失精度。查看此>