什么时候在Java中使用float类型?

时间:2016-12-23 07:40:57

标签: java bigdecimal floating-accuracy

我知道float类型是一个IEEE浮点数,并且计算不准确,例如,如果我想将两个浮点数8.42.4相加,我得到的是{{ 1}}而不是10.7999999。我也知道BigDecimal可以解决这个问题,但BigDecimal比float类型慢得多。

在大多数真实作品中,我们想要的精度值大于10.8而不是10.7999 ..所以我的问题是我是否应该尽可能地阻止在编程中使用浮点数?如果不是有任何用例?我的意思是在一个真正的生产。

4 个答案:

答案 0 :(得分:3)

如果您正在处理金额,那么8.42.4等数字就是准确的值,您可以使用BigDecimal来表示这些数字。但是,如果您正在进行物理计算,而您正在处理测量,则8.4和2.4的值无论如何都不准确,因为测量结果不准确。这是一个使用double更好的用例。此外,科学计算可能涉及平方根,三角函数,对数等事物,而这些只能使用IEEE浮点数来完成。涉及金钱的计算通常不涉及这些职能。

顺便说一句,没有理由使用float类型;坚持double

答案 1 :(得分:1)

当percision足够时,你使用float。使用float进行计算通常更快,并且需要更少的内存。有时你只需要表演。

答案 2 :(得分:1)

您所描述的是由于二进制浮点数不能精确地表示可由十进制浮点数精确表示的许多数字(如8.4或2.4)。

这不仅会影响Java中的float类型,还会影响double

在许多情况下,您可以使用整数进行计算,然后重新缩放以正确获取deciamls。但是如果你需要具有相同相对适应性的数字,无论它们有多大,浮点都要优越得多。

所以是的,如果可以的话,你应该更喜欢整数而不是浮点数,但是有许多应用程序需要浮点数。这包括许多科学和数学算法。

您还应该考虑显示10.7999999而不是10.8看起来很奇怪,但实际上差异非常小。因此,这不是一个固定问题,而是与数字格式更相关。在大多数情况下,通过在将数字转换为输出字符串时适当地舍入数字来解决此问题,例如:

String price = String.format("%.2f", floatPrice);

答案 3 :(得分:0)

BigDecimals非常精确(你可以确定它们的精确度 - 它主要受内存限制)但速度很慢且内存密集。当您需要精确的结果时,即在财务应用程序中,或者当您需要非常精确的结果且速度不是太关键时,您可以使用它们。

浮点类型(doublefloat)不是那么精确,但很多更快,它们只占用有限的内存。通常,float占用4个字节,double占用8个字节。您可以将它们用于无论如何都非常精确的测量,但如果您需要速度或内存,也可以使用它们。我将它们用于(实时)图形和实时音乐。或者,否则结果的精确度不那么重要,例如,在下载时测量时间或百分比等等。