如何实现超BigDecimal范围的Base2大数转可读十进制字符串?
问题:实现RealNumber类的可读十进制字符串转换方法
我正在实现一个RealNumber类,可存储正负范围从4.9E-324e-1.7976931348623157E308到1.7976931348623157E308e1.7976931348623157E308的数值(指数为double类型),该类基于Base2实现,已完成算术运算,但无法将其转换为...#####.#####...格式的可读字符串。
当前尝试的实现代码
@Nonnull public String toReadableString(@Nonnull MathContext context) { try { final BigDecimal mantissa = BigDecimal.valueOf(y); final BigDecimal exponentiation = BigDecimal.valueOf(2).pow((int) x, context); // 当|x|>999999999时,上述代码会抛出ArithmeticException,此限制由BigDecimal定义无法修改 final BigDecimal result = mantissa.multiply(exponentiation); return result.toPlainString(); } catch (final ArithmeticException e) { return "OUT_OF_DISPLAYABLE_RANGE"; } }
已尝试的方案(均未成功)
- 将exponent和mantissa转为BigDecimal计算(
BigDecimal.pow(int)存在限制) - 上述当前实现方案
- 直接使用
double(显然不可行) - 逐位迭代并将值添加到
BigDecimal中(可能代码有误,未成功)
需求总结
需要实现toReadableString() : String方法,可将2^double * double形式的Base2科学计数法数值转换为任意小数位数的可读十进制字符串。
RealNumber类结构
// 继承Vector2以使用其所有特性 public class RealNumber extends Vector2 implements Comparable<RealNumber> { public RealNumber(double val); public RealNumber(double exponent, double mantissa); public final double exponent(); public final double mantissa(); // 代码省略 public String toReadableString(MathContext context); // 实现如上 }
内容的提问来源于stack exchange,提问作者LXIV
相关产品推荐
相关产品推荐

