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

Java 如何仅将BigDecimal的整数部分转换为十六进制字符串?,java,hex,bigdecimal,Java,Hex,Bigdecimal,我有一个BigDecimal类型的数字,例如18446744073709551616,我想把它转换成十六进制值。我对截断分数部分没意见 有没有一种方法可以代替手动执行此操作?理论上,可以将BigDecimal表示为十六进制字符串,类似于Double.toHexString 0x1.199999999999p+1 但是,目前还没有标准的实现方法,自定义实现也不容易根据您的示例判断,您应该使用biginger而不是BigDecimal。这样你就可以使用 new BigInteger("184467

我有一个BigDecimal类型的数字,例如18446744073709551616,我想把它转换成十六进制值。我对截断分数部分没意见


有没有一种方法可以代替手动执行此操作?

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

0x1.199999999999p+1

但是,目前还没有标准的实现方法,自定义实现也不容易

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

new BigInteger("18446744073709551616").toString(16)
若不能更改原始对象的类型,请稍后在方法中将其转换为BigInteger

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

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

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

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

System.out.println(String.format("%A", myBigDecimal));
奇怪的是,关于格式化程序的javadoc,上面的代码是正确的,但是javadoc中似乎存在一个相关的9年错误,这个错误几周前在Java8中已经修复了:。您可以使用以下模拟代码:

System.out.println(String.format("%A", myBigDecimal.doubleValue()));
编辑
从你文章中的价值判断,你并不真正关心分数部分。您可以在模式中使用
%X
转换,只需提供
biginger
表示:

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

参考cource代码,但对于toString方法,它将例如“16”转换为“10”,而不是F,因为它应该是十六进制表示形式。“有什么方法可以得到正确的结果吗?”贝克说,这是正确的结果。十六进制
F
是十二月
15
。看看
a=10
b=11
c=12
d=13
e=14
f=15
。所以十进制
16
应该是
10
十六进制。我明白了,但是有没有一种方法可以将它自动转换为字母表示,而不是10-11-15?或者我手动执行?@becks为什么你认为
18446744073709551616
ffffffffffffffffff80
?这将删除前导零我得到第一个错误--java.util.IllegalFormatConversionException:a!=java.util.Formatter$FormattSpecifier.failConversion(Formatter.java:3999)的java.math.BigDecimal是的,这很奇怪,可能与一个bug有关:(用于
Formatter
的javadoc声明可以转换
BigDecimal
)。使用下面的表格,使用
doubleValue()
,它就会起作用。感谢您的澄清。我在代码中对上述值使用了doublevalue,但结果是0X1.0P64而不是0xFFFFFFFFFF80。这是预期值吗?我得到的是java.util.IllegalFormatConversionException:a!=java.math.BigDecimal for String.format(“%A”,新的BigDecimal(“1.1”)javadocs中有一个错误。结果是
%A
不接受
BigDecimal
。传入
BigDecimal.doubleValue()
。可以使用
格式化程序
%A
转换标志,请参阅。