【问题标题】:How to convert only the integer part of a BigDecimal to hex string?如何仅将 BigDecimal 的整数部分转换为十六进制字符串?
【发布时间】:2013-03-14 23:49:48
【问题描述】:

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

有没有办法代替手动执行此操作?

【问题讨论】:

标签: java hex bigdecimal


【解决方案1】:

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

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

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

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

【讨论】:

  • 但对于 toString 方法,它会将例如“16”转换为“10”而不是 F,因为它应该是十六进制表示。有什么可以得到正确的吗?
  • @becks 这是正确的结果。十六进制 F 是十进制 15。看看a=10b=11c=12d=13e=14f=15。所以十进制 16 将是 10 十六进制。
  • 我明白了,但是有没有一种方法可以自动将其转换为字母表示而不是 10 11 到 15 ?还是我手动做?
  • @becks 为什么你认为18446744073709551616FFFFFFFFFFFFFF80
  • 这将删除前导零
【解决方案2】:

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

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

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

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

奇怪的是,上面的代码对于 Formatter 的 javadoc 是正确的,但在 javadoc 中似乎存在一个相关的9 年错误,该错误已得到修复a几周前 在 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)
  • 是的,这很奇怪,可能与错误有关:5035569 : (fmt) assertion error in Formatter for BigDecimal and %aFormatter 的 javadoc 声明可以转换 BigDecimal)。使用下面的表格,使用doubleValue(),它会起作用。
  • 感谢您的澄清。我在代码中对上述值使用了双值,但结果是 0X1.0P64 而不是 0XFFFFFFFFFFFFFF80 这是预期的吗?
  • 我得到 java.util.IllegalFormatConversionException: a != java.math.BigDecimal for String.format("%A", new BigDecimal("1.1")
  • javadocs 中有错误。原来%A 不接受BigDecimal。传入BigDecimal.doubleValue()
【解决方案3】:

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

0x1.199999999999p+1

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

【讨论】:

  • 可以使用Formatter%A 转换标志,参见my answer
猜你喜欢
  • 2015-11-29
  • 2017-08-12
  • 2014-12-15
  • 2013-12-07
相关资源
最近更新 更多