我知道浮点类型是一个IEEE浮点,它不是计算的准确性,例如,如果我想总结两个浮点数8.4
和2.4
,我得到的是10.7999999
而不是10.8
。我也知道BigDecimal可以解决这个问题,但BigDecimal比float类型慢得多。什么时候应该在Java中使用float类型?
在最真实的作品,我们希望的精度值像上面10.8不是10.7999 ..所以我的问题是应避免使用浮动,就像我可以在编程?如果没有,有没有用例?我的意思是在实际生产中。
我知道浮点类型是一个IEEE浮点,它不是计算的准确性,例如,如果我想总结两个浮点数8.4
和2.4
,我得到的是10.7999999
而不是10.8
。我也知道BigDecimal可以解决这个问题,但BigDecimal比float类型慢得多。什么时候应该在Java中使用float类型?
在最真实的作品,我们希望的精度值像上面10.8不是10.7999 ..所以我的问题是应避免使用浮动,就像我可以在编程?如果没有,有没有用例?我的意思是在实际生产中。
如果您要处理的是货币金额,那么像8.4
和2.4
这样的数字就是确切的数值,您需要为这些数字使用BigDecimal
。但是,如果您在处理测量时进行物理计算,则值8.4和2.4无论如何都不准确,因为测量结果不准确。这是一个使用案例,使用double
更好。另外,科学计算可能涉及诸如平方根,三角函数,对数等等,而这些只能使用IEEE浮点数来完成。涉及金钱的计算通常不涉及这些功能。
顺便说一句,有很少的理由用不完float
类型;坚持double
。
测量结果是一个很好的原因。 – RobAu
我不是处理货币金额,而是货币数量,这与货币数量一样重要。所以在我的情况下,我必须改变为BigDecimal,或者坚持使用你建议的'double',然后在最后舍入2位小数位? –
取整浮点值是BAD决定。隐藏问题但不能解决。 –
当精确度足够时,您使用float
。用float进行计算通常会更快并且需要更少的内存。有时你只需要表现。
float可能会比双倍更快,可能在某些处理器上不会。同意,减少记忆。 –
你描述的是一个事实,即二进制浮点数字不能完全代表可以由十进制浮点数字,如8.4或2.4精确表示多的数字引起的。
这不仅影响了float
类型在Java中也double
。
在许多情况下,您可以使用整数进行计算,然后重新调整以正确获取分数。但是,如果你需要相等的相对应的数字,不管它们有多大,浮点数都是非常优越的。
所以,是的,如果你能,你应该更喜欢花车整数,但也有在需要浮点许多应用。这包括许多科学和数学算法。
你也应该考虑,在显示时,但实际上差别是非常小的,而不是10.7999999 10.8看起来奇怪。所以这不是一个准确性问题,而是更多与数字格式相关。
String price = String.format("%.2f", floatPrice);
然后对我的情况有什么建议,我正在处理一些数量(KG)计算,它对数量非常敏感,价格昂贵。改用BigDecimal? –
@ Neeson.Z:不,您可能在这里不需要BigDecimal。用'double'进行计算,然后适当地舍入结果,例如:'String price = String.format(“%。2f”,floatPrice);' –
BigDecimals
是非常精确的( - 它主要是由内存的限制就可以决定其精度):在大多数情况下,这种问题是通过将其转化时,一个输出的字符串,例如适当地舍入数目解决但非常缓慢且内存密集。当您需要确切的结果时,即在财务应用程序中,或者您需要非常精确的结果以及速度不太重要时,您可以使用它们。
浮点类型(double
和float
)是不是几乎一样精确,但多更快,他们只占用有限的内存。通常,float
占用4个字节,并且double
占用8个字节。无论如何,您都可以使用它们进行测量,但如果您需要速度或内存,也可以使用它们。我将它们用于(实时)图形和实时音乐。或者当结果的精确度不是那么重要时,例如在下载或测量时测量时间或百分比。
[Double vs. BigDecimal?](http://stackoverflow.com/questions/3413448/double-vs-bigdecimal) –
可能的重复你不应该因为编程期望的内存限制而使用浮点数,使用floor和ceil来得到你的正确答案,如果你使用BigDecimal,它会减慢你的程序,如果你得到你正确的答案。 – Sahadev
如果您想要精确度,请回答1dp或2dp – rafid059