BigDecimal
类有一些有用的方法来保证不会出现精度丢失:
byteValueExact()
shortValueExact()
intValueExact()
longValueExact()
然而,方法floatValueExact()
和doubleValueExact()
并不存在。
我查看了floatValue()
和doubleValue()
的OpenJDK源代码。两者都回退到分别返回正无穷大或负无穷大的Float.parseFloat()
和Double.parseDouble()
。例如,解析一个由10000个9组成的字符串将返回正无穷大。据我理解,BigDecimal
没有内部概念是无穷大的。此外,将由100个9组成的字符串解析为double
会得到1.0E100
,它不是无穷大,但会丢失精度。
有什么合理的实现floatValueExact()
和doubleValueExact()
的方法吗?
我曾考虑用BigDecimal.doubleValue()
、BigDecimal.toString()
、Double.parseDouble(String)
和Double.toString(double)
相结合的方式来解决double
的问题,但这看起来很混乱。我在这里提问,因为可能(一定!)有更简单的方法。
需要明确的是,我不需要高性能的解决方案。