如何将大十六进制数(带小数点)转换为BigDecimal

Gunjan Aggarwal:

我在a中有一个十六进制格式的大数字(带小数点)String,我想将其转换为aBigDecimal.

值示例: 0xcc.ccdp+1600

BigDecimal课堂上,我没有看到任何函数以十六进制格式表示数字的字符串作为输入并返回对应的BigDecimal.

有没有办法将大十六进制数从转换StringBigDecimal?

戴维·康拉德(David Conrad):

我很惊讶BigDecimal还不支持这一点。我写了以下内容,我认为应该可行。它通过我的初步测试(用0xcc.ccdp+00xcc.ccdp+10xcc.ccdp+160xcc.ccdp+256,和你的0xcc.ccdp+1600,也有一些负指数,从-1下到-16),但它应该更彻底地在生产代码在使用前进行测试。

private final static BigInteger TWO = BigInteger.valueOf(2);
private final static BigDecimal MINUS_ONE = new BigDecimal(-1);

public static BigDecimal toBigDecimal(String hex) {
    // handle leading sign
    BigDecimal sign = null;
    if (hex.startsWith("-")) {
        hex = hex.substring(1);
        sign = MINUS_ONE;
    } else if (hex.startsWith("+")) {
        hex = hex.substring(1);
    }

    // constant must start with 0x or 0X
    if (!(hex.startsWith("0x") || hex.startsWith("0X"))) {
        throw new IllegalArgumentException(
                "not a hexadecimal floating point constant");
    }
    hex = hex.substring(2);

    // ... and end in 'p' or 'P' and an exponent
    int p = hex.indexOf("p");
    if (p < 0) p = hex.indexOf("P");
    if (p < 0) {
        throw new IllegalArgumentException(
                "not a hexadecimal floating point constant");
    }
    String mantissa = hex.substring(0, p);
    String exponent = hex.substring(p+1);

    // find the hexadecimal point, if any
    int hexadecimalPoint = mantissa.indexOf(".");
    int hexadecimalPlaces = 0;
    if (hexadecimalPoint >= 0) {
        hexadecimalPlaces = mantissa.length() - 1 - hexadecimalPoint;
        mantissa = mantissa.substring(0, hexadecimalPoint) +
            mantissa.substring(hexadecimalPoint + 1);
    }

    // reduce the exponent by 4 for every hexadecimal place
    int binaryExponent = Integer.valueOf(exponent) - (hexadecimalPlaces * 4);
    boolean positive = true;
    if (binaryExponent < 0) {
        binaryExponent = -binaryExponent;
        positive = false;
    }

    BigDecimal base = new BigDecimal(new BigInteger(mantissa, 16));
    BigDecimal factor = new BigDecimal(TWO.pow(binaryExponent));
    BigDecimal value = positive? base.multiply(factor) : base.divide(factor);
    if (sign != null) value = value.multiply(sign);

    return value;
}

我已经在MIT许可下在github上发布了它有单元测试,但只有很少的一套。

如果您发现任何情况下返回的值不正确,请告诉我们。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在javascript中,如何将十进制(带小数点)转换为十六进制字符串

如何将十六进制数转换为颜色?

如何将小数转换为十六进制并使用Expect(TCL)脚本发送十六进制

使用AWK,如何将十进制数转换为十六进制数

如何将char *转换为带逗号(小数点)的数字函数?

如何将字节转换为十六进制字符

如何将十六进制转换为RGB

如何将 EBCDIC 转换为十六进制?

如何将十六进制转换为ASCII

如何将十六进制数据转换为UIImage?

如何将十六进制转换为NSColor?

如何将char数组转换为十六进制

如何将十六进制HTML转换为NSString

如何将十六进制字符串转换为十六进制数字

如何将十六进制编码的字符串转换为十六进制整数

如何将十六进制切片转换为带二进制补码的浮点数

如何将十进制转换为十六进制字符串的十六进制和XOR

C#如何将双精度数转换为带小数点和千位的字符串

如何将parseFloat字符串数字转换为带小数点后2位的浮点

如何将十六进制字符串转换为列表中的十六进制值块?

如何将存储为字符串的十六进制值转换为 Python 中的十六进制值?

爪哇 - 转换一个十六进制颜色到小数点颜色

如何将负十六进制转换为十进制

如何将十进制或十六进制值转换为整数?

如何将二进制整数转换为十六进制字符串?

如何将二进制数字转换为十六进制代码

汇编:如何将十六进制输入转换为十进制?

如何将很大的十进制字符串转换为十六进制?

如何将十六进制字符串转换为十进制值