【发布时间】:2014-09-14 09:19:51
【问题描述】:
我正在研究一种将字符串转换为适当的Number 类型的方法,具体取决于数字的格式。如果数字看起来是一个浮点值,那么我需要在不牺牲精度的情况下返回我可以使用的最小类型(Float、Double 或 BigDecimal)。
根据How many significant digits have floats and doubles in java?(和其他资源),我了解到Float 的尾数值有 23 位。基于此,我使用以下方法返回给定值的位长:
private static int getBitLengthOfSignificand(String integerPart,
String fractionalPart) {
return new BigInteger(integerPart + fractionalPart).bitLength();
}
如果这个测试的结果低于 24,我返回一个Float。如果低于 53,我返回 Double,否则返回 BigDecimal。
但是,当我考虑Float.MAX_VALUE(即3.4028235E38)时,我对结果感到困惑。根据我的方法,有效数字的位长为 26(其中 integerPart = 3 和 fractionalPart = 4028235。这会触发我的方法返回 Double,而显然 Float 就足够了。
有人能指出我的想法或实施中的缺陷吗?我的另一个想法是将字符串转换为BigDecimal 并使用floatValue() 和doubleValue() 缩小,测试溢出(由无限值表示)。但这会失去精度,所以不适合我。
【问题讨论】:
-
@tmyklebu 你能解释一下这是怎么重复的吗?我问了一个关于类型转换的非常具体的问题,你似乎已经链接到一个关于浮点数不准确性的通用问题。两者有什么关系?
-
如果不“牺牲精度”,您就无法做到这一点。在
3.4028235e38 = 0xFFFFFF2A6D7FC1BEF94AD08780000000和各种十进制情况下,计算精度损失的方法是通过计算二进制展开式,这使得这个问题与另一个问题基本相同。
标签: java floating-point type-conversion