Java什么时候用float类型?
When shall use float type in Java?
我知道 float 类型是 IEEE 浮点数,计算不准确,例如,如果我想对两个 float 8.4
和 2.4
求和,我得到的是10.7999999
而不是 10.8
。我也知道BigDecimal可以解决这个问题,但是BigDecimal比float类型慢很多。
在大多数实际作品中,我们希望精度值高于 10.8,而不是 10.7999.. 所以我的问题是我是否应该在编程中尽可能避免使用浮点数?如果没有,有没有用例?我的意思是在真正的制作中。
精度够用就用float
。使用 float 进行计算通常更快,并且需要更少的内存。有时您只需要性能。
如果您处理的是货币金额,那么像 8.4
和 2.4
这样的数字是精确值,您需要对这些数字使用 BigDecimal
。但是,如果您在处理测量值的情况下进行物理计算,则 8.4 和 2.4 的值无论如何都不会准确,因为测量值并不准确。这是使用 double
更好的用例。此外,科学计算可能涉及平方根、三角函数、对数等,而这些只能使用 IEEE 浮点数来完成。涉及金钱的计算通常不涉及这些函数。
顺便说一句,几乎没有理由使用 float
类型;坚持 double
.
你所描述的是由于二进制浮点数不能精确表示许多可以用十进制浮点数精确表示的数字,如 8.4 或 2.4。
这不仅会影响 Java 中的 float
类型,还会影响 double
。
在许多情况下,您可以使用整数进行计算,然后重新缩放以正确获得小数位数。但如果你需要相对精度相等的数字,无论它们有多大,浮点数都优越得多。
所以是的,如果可以的话,您应该更喜欢整数而不是浮点数,但是有很多应用程序需要浮点数。这包括许多科学和数学算法。
您还应该考虑到 10.7999999 而不是 10.8 在显示时看起来很奇怪,但实际上差异非常小。所以这与其说是一个准确性问题,不如说是与数字格式有关。在大多数情况下,这个问题可以通过在将数字转换为字符串输出时适当地四舍五入来解决,例如:
String price = String.format("%.2f", floatPrice);
BigDecimals
非常精确(您可以确定它们的精度——它主要受内存限制)但速度很慢且占用大量内存。当您需要精确的结果时,例如在财务应用程序中,或者当您需要非常精确的结果并且速度不是太关键时,您可以使用它们。
浮点类型(double
和 float
)几乎没有那么精确,但是 快得多 而且它们只占用有限的内存。通常,float
占用 4 个字节,double
占用 8 个字节。您可以将它们用于无论如何都不是很精确的测量,但如果您需要速度或内存,也可以使用它们。我将它们用于(实时)图形和实时音乐。或者当结果的精度不是那么重要时,例如下载时测量时间或百分比等。
我知道 float 类型是 IEEE 浮点数,计算不准确,例如,如果我想对两个 float 8.4
和 2.4
求和,我得到的是10.7999999
而不是 10.8
。我也知道BigDecimal可以解决这个问题,但是BigDecimal比float类型慢很多。
在大多数实际作品中,我们希望精度值高于 10.8,而不是 10.7999.. 所以我的问题是我是否应该在编程中尽可能避免使用浮点数?如果没有,有没有用例?我的意思是在真正的制作中。
精度够用就用float
。使用 float 进行计算通常更快,并且需要更少的内存。有时您只需要性能。
如果您处理的是货币金额,那么像 8.4
和 2.4
这样的数字是精确值,您需要对这些数字使用 BigDecimal
。但是,如果您在处理测量值的情况下进行物理计算,则 8.4 和 2.4 的值无论如何都不会准确,因为测量值并不准确。这是使用 double
更好的用例。此外,科学计算可能涉及平方根、三角函数、对数等,而这些只能使用 IEEE 浮点数来完成。涉及金钱的计算通常不涉及这些函数。
顺便说一句,几乎没有理由使用 float
类型;坚持 double
.
你所描述的是由于二进制浮点数不能精确表示许多可以用十进制浮点数精确表示的数字,如 8.4 或 2.4。
这不仅会影响 Java 中的 float
类型,还会影响 double
。
在许多情况下,您可以使用整数进行计算,然后重新缩放以正确获得小数位数。但如果你需要相对精度相等的数字,无论它们有多大,浮点数都优越得多。
所以是的,如果可以的话,您应该更喜欢整数而不是浮点数,但是有很多应用程序需要浮点数。这包括许多科学和数学算法。
您还应该考虑到 10.7999999 而不是 10.8 在显示时看起来很奇怪,但实际上差异非常小。所以这与其说是一个准确性问题,不如说是与数字格式有关。在大多数情况下,这个问题可以通过在将数字转换为字符串输出时适当地四舍五入来解决,例如:
String price = String.format("%.2f", floatPrice);
BigDecimals
非常精确(您可以确定它们的精度——它主要受内存限制)但速度很慢且占用大量内存。当您需要精确的结果时,例如在财务应用程序中,或者当您需要非常精确的结果并且速度不是太关键时,您可以使用它们。
浮点类型(double
和 float
)几乎没有那么精确,但是 快得多 而且它们只占用有限的内存。通常,float
占用 4 个字节,double
占用 8 个字节。您可以将它们用于无论如何都不是很精确的测量,但如果您需要速度或内存,也可以使用它们。我将它们用于(实时)图形和实时音乐。或者当结果的精度不是那么重要时,例如下载时测量时间或百分比等。