java如何知道BigDecimal是否可以精确地转换为float或double?
类BigDecimal
有一些有用的方法来保证无损转换:
byteValueExact()
shortValueExact()
intValueExact()
longValueExact()
但是,方法floatValueExact()
和doubleValueExact()
不存在
我阅读了方法floatValue()
和doubleValue()
的OpenJDK源代码。两者似乎分别回退到Float.parseFloat()
和Double.parseDouble()
,这可能返回正无穷大或负无穷大。例如,解析10000个9的字符串将返回正无穷大。据我所知,BigDecimal
没有无限的内部概念。此外,将100个9的字符串解析为double
会得到1.0E100
,这不是无穷大,但会丢失精度
什么是合理的实现floatValueExact()
和doubleValueExact()
我想通过组合{
明确地说,我不需要高性能的解决方案
# 1 楼答案
从readingthedocs开始,它对
numTypeValueExact
变量所做的一切就是检查分数部分的存在,或者该值对于数值类型是否太大,并引发异常至于^{} 和^{} ,正在进行类似的溢出检查,但它不是抛出异常,而是返回
Double.POSITIVE_INFINITY
或Double.NEGATIVE_INFINITY
作为双精度,返回Float.POSITIVE_INFINITY
或Float.NEGATIVE_INFINITY
作为浮点数因此,对于float和double的
exact
方法,最合理(也是最简单)的实现应该只是检查转换是否返回POSITIVE_INFINITY
或NEGATIVE_INFINITY
此外,,请记住,
BigDecimal
的设计是为了处理使用float
或double
处理大型非理性的精度不足,因此,与@JB Nizet{a7}一样,您可以添加到上面的另一个检查是将double
或float
转换回BigDecimal
,以查看是否仍然得到相同的值。这应该证明转换是正确的下面是
floatValueExact()
的这种方法的样子:使用^{} 而不是上面的^{} 是故意的,这样就不会对检查太严格^只有当两个}才会计算为true,而
BigDecimal
对象具有相同的值和比例(小数部分的大小)时,{compareTo
在无关紧要的情况下会忽略这一差异。例如2.0
对2.00