如何将BigDecimal的整数部分转换为十六进制字符串?

3
我有一个BigDecimal类型的数字,例如18446744073709551616,我想将它转换为十六进制值。如果小数部分被截断了,我也没问题。
有没有一种方法可以自动实现而不是手动转换?

请参考此处的源代码:http://www.docjar.com/html/api/java/math/BigDecimal.java.html - chiru
3个回答

12

根据您的示例,应该使用BigInteger而不是BigDecimal。这样你就可以使用

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

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

new BigDecimal("18446744073709551616").toBigInteger().toString(16);

但是对于toString方法,它将例如“16”转换为“10”,而不是应该在十六进制表示中的F。 有什么办法可以得到正确的结果吗? - becks
我尝试使用我的帖子中的值,但它将其转换为10000000000000000而不是FFFFFFFFFFFFFF80。这是否符合预期? - becks
1
@becks,你为什么认为18446744073709551616FFFFFFFFFFFFFF80 - Pshemo
抱歉,各位,我计算错了。非常感谢你们的帮助 :-) - becks
1
这将删除前导零。 - Pavel Evstigneev
显示剩余8条评论

2
请注意,将十进制值转换为十六进制需要一个指数。您可以使用Formatter获取表示数字值的十六进制字符串。

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

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

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

有趣的是,上述代码在Formatter的javadoc方面是正确的,但是似乎在javadoc中存在一个相关的9年错误,这个错误已经在几周前的Java 8中得到修复:5035569 : (fmt) assertion error in Formatter for BigDecimal and %a。您可以使用下面的类比代码:

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

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

BigDecimal bd = new BigDecimal("18446744073709551616");
System.out.println(String.format("%X", bd.toBigInteger()));

我在第一个遇到了这个错误 -- java.util.IllegalFormatConversionException: a != java.math.BigDecimal at java.util.Formatter$FormatSpecifier.failConversion(Formatter.java:3999) - becks
是的,这很奇怪,可能与一个错误有关:5035569:(fmt)BigDecimal和%a的格式化程序中的断言错误Formatter的javadoc说明可以转换BigDecimal)。使用下面的表单,使用doubleValue(),它将起作用。 - Xavi López
感谢澄清。 我在代码中使用了doublevalue来表示上述值,但结果是0X1.0P64而不是0XFFFFFFFFFFFFFF80。 这是否是预期的结果? - becks
1
我遇到了java.util.IllegalFormatConversionException异常:a != java.math.BigDecimal,这是由于使用String.format("%A", new BigDecimal("1.1"))引起的。 - Evgeniy Dorofeev
1
Javadocs中有一个错误。原来%A不接受BigDecimal。请传入BigDecimal.doubleValue() - Xavi López

1
理论上可以将BigDecimal表示为十六进制字符串,类似于Double.toHexString。
0x1.199999999999p+1

但据我所知,目前没有标准的方法来实现它,自定义实现也不容易。

可以使用Formatter%A转换标志实现,参见我的回答 - Xavi López

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接