我有一个BigDecimal类型的数字,例如18446744073709551616,我想将它转换为十六进制值。如果小数部分被截断了,我也没问题。
有没有一种方法可以自动实现而不是手动转换?
有没有一种方法可以自动实现而不是手动转换?
根据您的示例,应该使用BigInteger
而不是BigDecimal
。这样你就可以使用
new BigInteger("18446744073709551616").toString(16)
如果您无法更改原始对象的类型,请在方法后将其转换为BigInteger。
new BigDecimal("18446744073709551616").toBigInteger().toString(16);
18446744073709551616
是FFFFFFFFFFFFFF80
? - PshemoFormatter
获取表示数字值的十六进制字符串。
%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()));
Formatter
的javadoc说明可以转换BigDecimal
)。使用下面的表单,使用doubleValue()
,它将起作用。 - Xavi López%A
不接受BigDecimal
。请传入BigDecimal.doubleValue()
。 - Xavi López0x1.199999999999p+1