是否存在将double值转换为BigInteger值并稍后返回的正确方法?在最佳情况下,不会丢失数据。问题是,我不知道双精度值有多少个小数位。但是我需要对仅适用于非十进制值的算法进行此转换。算法完成后,我必须将其转换回去。
我需要的一个简单示例:例如2个双精度值的总和,但“ sum”函数仅适用于BigInteger。
该程序基于BigDecimal-and-scale的想法,就像在assylias的答案中一样,但经过修改后可以无条件使用最大可能的规模。这允许在数字流中使用相同的标度,而无需在处理任何数字之前查看所有数字。代价是它通常会返回不必要的大BigInteger值。
比例因子“ 1e1074”基于以下观察结果:所有有限双精度数都是Double.MIN_VALUE的整数倍,Double.MIN_VALUE具有小数点后的1074个小数位。小数点后没有任何双精度数可以有更多的十进制数字。
import java.math.BigDecimal;
import java.math.BigInteger;
public class Test {
public static void main(String[] args) {
testit(Double.MIN_VALUE);
testit(Double.MAX_VALUE);
testit(0);
testit(1.0);
testit(Math.E);
testit(Math.PI);
}
private static void testit(double d) {
double roundTrip = scaledIntegerToDouble(doubleToScaledInteger(d));
if (d != roundTrip) {
System.out.println("ERROR: " + d + " " + roundTrip);
}
}
public static final BigDecimal scale = new BigDecimal("1e1074");
public static BigInteger doubleToScaledInteger(double d) {
BigDecimal bd = new BigDecimal(d).multiply(scale);
return bd.toBigIntegerExact();
}
public static double scaledIntegerToDouble(BigInteger bi) {
BigDecimal bd = new BigDecimal(bi).divide(scale);
return bd.doubleValue();
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句