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