在我的申请中,我使用浮动值来保持客户得分。根据要求,分数在点之前可能只有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" ?
任何建议都表示赞赏。
答案 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位数。