vba:什么是97.45*1#=?

l--*_*''' 5 excel vba

some_integer = 97.45 * 1#
Run Code Online (Sandbox Code Playgroud)

这种符号是什么意思?some_integer =会是什么?

Oor*_*ang 15

只是为了扩展其他人添加的内容......如上所述,哈希标记(#)是类型声明字符(TDC)并强制文字"1"为Double类型.此数据类型转换属于称为"显式转换"的一类转换.此类中还有Casts(例如CStr(),CLng()等).

显式转换通常用于避免不正确的隐式转换.隐式转换是VBA自动执行的转换.如果声明并键入所有变量(示例Dim j As Long),则更容易控制数据的解释方式.但是,仍有一些边缘情况涉及如何处理文字("硬编码数字").

我知道使用类型声明字符和文字的最常见原因是:

  1. 强制将十六进制和八进制文字强制为Longs以避免已知问题.(更多信息:http://support.microsoft.com/kb/38888)
  2. 防止在数学运算产生的结果大于操作中使用的最大DataType时导致的常见溢出条件.
  3. 避免浮点计算异常.
  4. 微型优化.类型声明字符引起的转换发生在编译时.转换转换和隐式转换在运行时发生.在99.999%的情况下,这将不会产生任何可衡量的收益,通常是浪费时间.

由于你的例子没有做任何事情,我只能猜测它不是真正的代码.因此,很难直接了解作者的意图.1不适用.原因2是可能的.我将描述问题和可能的解决方案.

要了解溢出问题,您需要了解两件事.如何输入文字以及隐式转换的工作原理.如果没有类型声明字符,则文字将默认分配类型.以下是规则:

  1. 如果值是引号,即使它是数值,它也是String.
  2. 如果值为数字且具有小数,则为Double.
  3. 如果值为数字,没有小数,并且介于-32,767和32,767(含)之间,则为Integer类型.
  4. 如果值为数字,没有小数,并且介于-2,147,483,647和2,147,483,647(含)之间,但介于-32,767和32,767之间,则属于Long类型.
  5. 如果值为数字,没有小数,并且 -2,147,483,647到2,147,483,647范围之外,则为Double类型.
  6. 科学记谱法中的任何文字都是双重的.

既然你知道如何输入文字,你需要理解隐式转换.所有数学运算都处理两个输入值并输出一个结果.通过分析输入值的DataTypes来选择结果的DataType.输出DataType基于三个规则选择:1.如果任一输入值属于DataType Variant,VBA将根据为文字描述的相同规则选择输出DataType.2.如果输入两个输入值,则它将选择两种数据类型中较大的一种.3.如果两个输入值的类型相同,则输出DateType将与输入DataType相同(假设该类型不是"Variant").

条件3出现问题.如果你有两个整数(例如500和400)并对它们执行操作(例如500*400),则会产生一个大的结果(200,000)以放入生成的DateType(整数) ).然后你得到一个溢出错误.默认情况下,由于500和400是整数,因此必须通过类型声明字符(例如500和*400)将其中一个明确键入Long或Double来避免这种情况.然后当选择输出类型时,它将选择两个(Long)中较大的一个,它足够大以保持结果.

我可以肯定地说,如果原因是2那么就没有理由担心(至少在给定的例子中).默认情况下,任何带小数点的文字都是Double类型.由于隐式转换总是选择操作中的最大类型,而Double总是存在,无论如何都不会产生溢出.

如果关注的原因是一个浮点问题,那么需要更加认真地考虑一个真实的例子,以便能够看到你是否需要类型声明字符.

如果原因是微优化,那么将它留在那里并不重要.从技术上讲,最好使用Double with Double.离开它没有任何害处.但是,没有任何理由可以选择将其中任何一个放入其中.


杂项

各种类型声明字符如下:

Type Declaration Character Data Type
          %                 Integer
          &                 Long
          !                 Single
          #                 Double
          $                 String
          @                 Currency 

要添加更多信息:类型声明字符可以在Dim语句中使用它们对应的类型(尽管许多人认为这是一种不好的做法).因此:在两种情况下都Dim s As StringDim s$s 一样创建为String.同样,您可以使用TDC键入函数返回值.所以Public Function MyFunc()&是一样的Public Function MyFunc() As Long.


转换功能

Function    Return Type
CBool       Boolean
CByte       Byte
CCur        Currency 
CDate       Date 
CDbl        Double 
CDec        Decimal
CInt        Integer
CLng        Long
CSng        Single
CStr        String
CVar        Variant


Chi*_*ghE 9

some_integer 将是97.45.

它用于将1视为双重而不是任何其他类型.(EG 1可以视为整数,但在这种情况下,我们希望将1视为双精度)

你可以把它想象some_integer = 97.45 * 1#成一样some_integer = 97.45 * 1.00


小智 6

1#意思是"1为双".当然,如果some_integer 是一个整数,那么结果表达式的非整数部分将被截断为97(因此我很困惑它在这种情况下正在做什么).

信息:在数据类型图表中键入声明字符(在VBA中)