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

时间:2017-11-05 07:02:24

标签: 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);

        float f2 = 99999.999f;
        System.out.println(f2);
    }
}

输出是:

9999.999
100000.0

这里,为什么价值" 99999.999"自动递增到" 100000.0"在使用sysout时? 为什么在点之前使用四位十进制数值时没有发生同样的事情,即" 9999.999" ?

任何建议都表示赞赏。

2 个答案:

答案 0 :(得分:3)

来自java规范:

  

float:float数据类型是单精度32位IEEE 754   浮点。它的价值范围超出了这个范围   讨论,但在浮点类型,格式和   Java语言规范的值部分。和。一样   对于byte和short的建议,使用float(而不是double)if   你需要在大型浮点数中保存内存。   绝不应将此数据类型用于精确值,例如   货币。为此,您需要使用java.math.BigDecimal   而是改为。数字和字符串涵盖了BigDecimal和其他有用的东西   Java平台提供的类。

总结如果你想节省内存并且你不关心精确使用浮动,否则使用double。 更多信息https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

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

答案 1 :(得分:3)

float使用 24位作为其“尾数”,其中包含所有有效数字。这意味着浮点数通常高达7个有效数字。您的号码为99999.999f,其有效数字为8。因此,在7位数后您将失去精确度,并且会在7位数之后出现此类错误。

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

您将获得正确的结果,因为双重使用 53位作为“尾数”,因此它可以准确地保存大约16位数。