2

我有一些 BigDecimal 类型,例如 18446744073709551616,我想将其转换为十六进制值。我可以截断小数部分。

有没有办法做到这一点而不是手动做?

4

3 回答 3

10

从您的示例来看,您应该使用BigInteger而不是BigDecimal. 这样你就可以使用

new BigInteger("18446744073709551616").toString(16)

如果您无法更改原始对象的类型,请稍后在方法中将其转换为 BigInteger

new BigDecimal("18446744073709551616").toBigInteger().toString(16);
于 2013-03-25T13:26:58.143 回答
2

考虑到将十进制值转换为十六进制需要一个指数。您可以使用 获取表示数值的十六进制字符串Formatter

%A : 结果被格式化为十六进制浮点数,带有效数和指数
%X: 结果被格式化为十六进制整数

%A如果要转换十进制值,请使用转换:

System.out.println(String.format("%A", myBigDecimal));

奇怪的是,上面的代码对于 的 javadoc 是正确的Formatter,但是 javadocs 中似乎有一个相关的9 年前的错误,几周前在 Java 8中已修复: 5035569:Formatter 中的 (fmt) 断言错误对于 BigDecimal 和 %a。您可以使用下面的模拟代码:

System.out.println(String.format("%A", myBigDecimal.doubleValue()));

编辑
从您帖子中的价值来看,您并不真正关心小数部分。您可以%X在模式中使用转换并只提供BigInteger表示:

BigDecimal bd = new BigDecimal("18446744073709551616");
System.out.println(String.format("%X", bd.toBigInteger()));
于 2013-03-25T13:33:51.277 回答
1

理论上可以将 BigDecimal 表示为十六进制字符串,类似于 Double.toHexString

0x1.199999999999p+1

但是 AFAIK 没有标准的方法来做到这一点,自定义实现并不容易

于 2013-03-25T13:15:21.940 回答