从十六进制字符串转换为Double会产生错误的结果

时间:2014-01-20 21:08:28

标签: excel excel-vba excel-2013 vba

我正在尝试将14位十六进制数转换为十进制数。

我有这个VBA代码。

Option Explicit

Public Function HexadecimalToDecimal(HexValue As String) As Double

Dim ModifiedHexValue As String
ModifiedHexValue = Replace(HexValue, "0x", "&H")

HexadecimalToDecimal = CDec(ModifiedHexValue)
End Function

将这样的数字转换为十进制

  • 0x047B1142591E80
  • 0x044A81325A1E80
  • 0x047B7542591E80

我不断在大量数据中获得随机结果。有时在其他时间发现数字偏离了6或2。

2 个答案:

答案 0 :(得分:2)

尝试将函数的返回类型从Double更改为VariantDouble只有大约15个十进制数字的精度,因此不能,例如,准确捕获值1261213964639872(有16位数)。它最接近的是1261213964639870.通过将返回类型更改为Variant,将保留CDec返回的完整精度。您不能使用Decimal返回类型,因为VBA由于某种原因不支持此类。

答案 1 :(得分:1)

问题不在于VBA。 Excel单元格只能以数字格式保存15位数字。因此,“数字” 1234567891234567 将始终显示 1234567891234560 。通过将项目转换为文本和/或将单元格格式更改为文本可以避免这种情况。

但这并不总是奏效。

确保它将保留所有数字的唯一可靠方法是将某些内容附加到不是数字的字符串上。

此代码将在数字前附加撇号,但返回整个字符串。

Public Function HexadecimalToDecimal(HexValue As String) As String

    Dim ModifiedHexValue As String
    ModifiedHexValue = Replace(HexValue, "0x", "&H")

    HexadecimalToDecimal = "'" & CDec(ModifiedHexValue)
End Function

不幸的是,这不是一个完美的解决方案。