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声明字符最常见的原因是:
- 强制hex和八进制文字为了避免已知的问题。 (更多信息: http : //support.microsoft.com/kb/38888 )
- 防止math运算产生的结果大于操作中使用的最大数据types时引起的常见溢出情况。
- 避免浮点计算exception。
- 微型优化。 types声明字符引起的转换发生在编译时。 在运行时发生Casted转换和隐式转换。 在99.999%的情况下,这将不会产生任何可衡量的收益,通常是浪费时间。
由于你的例子没有做任何事情,我只能猜测它不是真正的代码。 所以很难直视作者的意图。 1不适用。 原因2是可能的。 我会描述这个问题和一个可能的解决办法。
要理解溢出问题,您需要了解两件事情。 如何input文字以及隐式转换是如何工作的。 如果没有types声明字符,则文字将具有默认分配的types。 这是规则:
- 如果值是用引号引起来的,即使它是一个数字值也是一个String。
- 如果该值是数字,并有一个小数,它是一个Double。
- 如果该值是数字, 没有小数,并且介于-32,767和32,767(含)之间,则它是Integertypes。
- 如果值是数字, 没有小数,介于-2,147,483,647和2,147,483,647(含)之间,但不在 -32,767和32,767之间,它是Longtypes。
- 如果值是数字, 没有小数,并且在 -2,147,483,647到2,147,483,647的范围之外 ,则它是Doubletypes的。
- 科学记数法中的任何字面都将是双重的。
现在你知道如何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 String
与Dim 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