vba:什么是97.45 * 1#=?

some_integer = 97.45 * 1# 

这个符号是什么意思? some_integer =什么?

只是为了展开其他人已经添加的东西…如前所述,散列标记(#)是types声明字符(TDC),并强制文字“1”为Doubletypes。 此数据types转换属于一类名为“显式转换”的转换。 也在这个类中有Casts(如CStr(),CLng()等)。

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

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

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

由于你的例子没有做任何事情,我只能猜测它不是真正的代码。 所以很难直视作者的意图。 1不适用。 原因2是可能的。 我会描述这个问题和一个可能的解决办法。

要理解溢出问题,您需要了解两件事情。 如何input文字以及隐式转换是如何工作的。 如果没有types声明字符,则文字将具有默认分配的types。 这是规则:

  1. 如果值是用引号引起来的,即使它是一个数字值也是一个String。
  2. 如果该值是数字,并有一个小数,它是一个Double。
  3. 如果该值是数字, 没有小数,并且介于-32,767和32,767(含)之间,则它是Integertypes。
  4. 如果值是数字, 没有小数,介于-2,147,483,647和2,147,483,647(含)之间,但不在 -32,767和32,767之间,它是Longtypes。
  5. 如果值是数字, 没有小数,并且 -2,147,483,647到2,147,483,647的范围之外 ,则它是Doubletypes的。
  6. 科学记数法中的任何字面都将是双重的。

现在你知道如何input一个文字,你需要了解隐式转换。 所有math运算都对两个input值起作用并输出一个结果。 结果的DataType是通过分析input值的DataType来select的。 输出DataType是基于三个规则select的:1.如果任何一个input值是DataType Variant,VBA将根据文字描述的相同规则select输出DataType。 2.如果两个input值都是键入的,那么它将select两个数据types中较大的一个。 3.如果两个input值的types相同,则输出DateType将与inputDataType相同(假定该types不是“Variant”)。

如果你有两个整数(例如500和400),并且对它们执行一个操作(例如500 * 400),那么会产生一个大的结果(200,000),放入结果DateType(Integer )。 然后你得到一个溢出错误。 由于默认情况下500和400是整数,你必须通过types声明字符(例如500和* 400)将其中的一个键入到Long或Double中来避免这种情况。 然后,当select输出types时,它会select两个(Long)中较大的一个,这个大小足以保存结果。

我可以肯定地说,如果原因是2,那么就没有理由担心(至less在给定的例子中)。 任何带有小数点的文字默认都是Doubletypes的。 由于隐式转换总是select操作中的最大types,并且Double总是存在,所以无论发生什么溢出,都没有机会产生溢出。

如果引起关注的问题是浮点问题,那么需要一个更加认真的考虑,以一个真实的例子来看看是否需要types声明字符。

如果原因是微型优化,那么如果你把它留在那里真的没关系。 从技术上来说,最好使用Double Double。 所以离开它没有什么坏处。 但是,没有任何理由可以让你自己去做。


杂项

各种types的声明字符如下:

types声明字符数据types
           % 整数
           & 长
           ! 单
           #双
           $ String
           @货币 

要添加更多的信息:types声明字符可以在Dim语句中使用它们相应的types(虽然这被认为是由许多不良做法造成的)。 因此: Dim s As StringDim s$相同。在这两种情况下, Dim s$ s将被创build为一个String。 同样,您可以使用TDC键入一个函数返回值。 所以Public Function MyFunc()&Public Function MyFunc() As Long


转换函数

函数返回types
 CBool​​布尔值
 CByte字节
 CCur货币 
 CDatedate 
 CDbl双 
 CDec十进制
 CInt整数
 CLng Long
 CSng单身
 CStrstring
 CVar变体

some_integer将是97.45。

它被用来把1作为一个double而不是其他任何types。 (EG 1可以看作一个整数,但在这种情况下我们想把1看作是一个整数)

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

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

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

VB中的#表示“Doubletypes”。

所以some_integer将是97。

1#表示1被评估为双精度 。

我怀疑这会对这个计算产生什么影响。 如果1是未修饰的,则计算结果仍然为97.45,因此将其视为整数。 当计算结果被分配给整数some_integer ,它将是97。

 Sub Macro1() Dim i As Integer i = 97.45 * 1# MsgBox (i) 'Shows 97 End Sub