我已经在Java System.out.print(1-.6)打印.4中试验了float和double类型有什么问题,结果有点意外(0.30000000000000004)是System.out.print(1-0.7)。如果有人能够指导我解释某些资源来解释为什么会发生,那将会很有帮助。我假设它不是Java特定的,这些类型本身就是错误的。Float和Double为货币值
谢谢!
我已经在Java System.out.print(1-.6)打印.4中试验了float和double类型有什么问题,结果有点意外(0.30000000000000004)是System.out.print(1-0.7)。如果有人能够指导我解释某些资源来解释为什么会发生,那将会很有帮助。我假设它不是Java特定的,这些类型本身就是错误的。Float和Double为货币值
谢谢!
Java中的实际类型是IEEE754 single and double precision floating point notation的实现。这些是实数的近似值,而不是精确的表示。一些像0.8这样的实数不能准确表示。
如所述文森特float
和double
类型不能存储将不被表示为2^-n值(Ñ大小取决于实现)的总和值。
改为使用BigDecimal类。
http://docs.sun.com/source/806-3568/ncg_goldberg.html – 2010-12-04 17:12:01
http://stackoverflow.com/questions/285680/representing-monetary-values-in-java给出了最好的建议。使用BigDecimal。 – 2010-12-04 17:16:17
我觉得这是一个持续娱乐的来源,在目前的1,123,061个问题中,67%的问题与浮点错误有关:-) – paxdiablo 2010-12-04 17:17:08