Java 浮点除以1000时数据丢失
我有一个浮子Java 浮点除以1000时数据丢失,java,Java,我有一个浮子 float data = 24931192; 当我把它除以1000 data = data / 1000; 它还给我24931.191。谁能告诉我为什么?我怎样才能预防呢? 谢谢你浮点数/浮点数只有这么高的精度(准确地说,在Java中是23位的精度),而你刚刚遇到了一个精度不够的问题。如果浮点数不够,请尝试使用double,尽管即使这些浮点数最终也会遇到问题。浮点数据类型没有无限精度,因此您会看到类似这样的小问题。一个选项(如果您真的想要浮点结果)是以双精度执行操作,然后强制转
float data = 24931192;
当我把它除以1000
data = data / 1000;
它还给我24931.191。谁能告诉我为什么?我怎样才能预防呢?
谢谢你浮点数/浮点数只有这么高的精度(准确地说,在Java中是23位的精度),而你刚刚遇到了一个精度不够的问题。如果浮点数不够,请尝试使用double,尽管即使这些浮点数最终也会遇到问题。浮点数据类型没有无限精度,因此您会看到类似这样的小问题。一个选项(如果您真的想要浮点结果)是以双精度执行操作,然后强制转换为浮点。另一个选项是使用BigDecimal而不是float。浮点值(
float
和double
)是近似值。您可能会看到舍入错误,实际上不可能精确地表示某些值。想想1/3=0.333333…
:最终,数字的存储槽用完了,您最终得到了“(1/3)*3=0.999999…”
大多数用法不需要足够精确的答案,只需要一个
double
。如果需要,请查看BigDecimal
,这要慢得多。浮点的精度有限。在这里,您可以阅读有关浮点编码方式的更多信息:
如果您关心精度,您应该使用BigDecimal:使用
java.math.BigDecimal
类型。浮点数的精度不是无限的。最终您总会遇到此类问题。有关更全面的讨论,请参阅。