Office中国论坛/Access中国论坛

标题: 邪门了:VBA为什么用Currency型不能表达-922337203685477.5808(银行欠我的钱) [打印本页]

作者: topses    时间: 2015-5-30 09:22
标题: 邪门了:VBA为什么用Currency型不能表达-922337203685477.5808(银行欠我的钱)
本帖最后由 topses 于 2015-5-30 09:28 编辑

VBA为什么用Currency型不能表达-922337203685477.5808,只能表达  -922337203685477.5807@ ,少了我0.0001元,这是绝不允许的
(这是银行欠我的钱{:soso_e121:})
    Dim Hi As Long, Lo As Long, MaxVal As Currency, MinVal As Currency
    MaxVal = 922337203685477.5807@
    MinVal = -922337203685477.5807@     '-922337203685477.5808@ -922337203685477.5807@





作者: topses    时间: 2015-5-30 09:23
本帖最后由 topses 于 2015-5-30 09:25 编辑

但是直接用复制就可以。这是为什么?
    '创造一个&H80000000 00000000    -922337203685477.5808@
    Hi = &H80000000:    Lo = &H0&:   MinVal = 0@
    CopyMemory ByVal VarPtr(MinVal) + 4&, Hi, 4&
    CopyMemory MinVal, Lo, 4&
    Debug.Print MinVal      

'结果能输出 -922337203685477.5808@

作者: tmtony    时间: 2015-5-30 09:38
双精度是否可以?
作者: ganlinlao    时间: 2015-5-30 11:48
{:soso_e179:}好细心呀,楼主
我怀疑是编辑器的问题。也就是编辑器不允许你输入
MinVal = -922337203685477.5808@
而Currency的范围 -922337203685477.5808 到 922337203685477.5807是没有问题的

用你的例子:
sub test()
Dim Hi As Long, Lo As Long, MaxVal As Currency, MinVal As Currency,temp as Variant
    MaxVal = 922337203685477.5807@
    temp="-922337203685477.5808"  '用字符串形式转入
    MinVal = Ccur(temp)    '将variant转成Currency,如果无法转,说明Currency有问题
Debug.Print MinVal
end sub


作者: topses    时间: 2015-5-30 19:51
tmtony 发表于 2015-5-30 09:38
双精度是否可以?

双精度只支持48位,我这里有64位
作者: topses    时间: 2015-5-30 20:55
ganlinlao 发表于 2015-5-30 11:48
好细心呀,楼主
我怀疑是编辑器的问题。也就是编辑器不允许你输入
MinVal = -9223372036854 ...

这样是可以的
你可以直接这样,没必要CCUR
    MaxVal = "-922337203685477.5808" '用字符串形式转入
    MinVal = "&H800000000000"   '&H80000000 000000000 64位不支持,&H80000000 0000 48位支持(VBA后台应该也是字符串先转换为DOUBLE值,然后再作CCUR的转换)


还总结一些:
Watch :   :     6 / 3 : 2 : Double :除法,不管整数还是小数
Watch :   :     3 ^ 6 : 729 : Double : 指数运算,不管整数还是小数

Watch :   :     3.8 * 6 : 22.8 : Double :
Watch :   :     3 * 6 : 18 : Integer : 乘法依据数据类型,整形》长整形》双精度》货币型
Watch :   :     3 + 2 : 5 : Integer :
Watch :   :     3.1 + 2.2 : 5.3 : Double : 加法,同乘法
Watch :   : 3 - 2 : 1 : Integer :
Watch :   :     3.3 - 2.6 : .7 : Double : 减法,同乘法


Currency:+-*/^支持,其他运算符不支持,但注意:/与^转换为DOUBLE处理

算术:mod 和 整除/ 和 所有逻辑,这些仅支持INTEGER, LONG(如果输入有小数,则转换取整)

作者: topses    时间: 2015-5-31 17:49
邪门的事情也发生LONG和INTEGER的类型上。难道是VBA的编译器的问题。(MS不至于这么傻,应该是自己的水平有限)
dim MinVal as long
MinVal =-2147483648&
dim MinVal as integer
MinVal =-32768%   '由于VB自动转换为LONG型了,这里实际看不出来,但可以看到不可以用-32768表示整形

但有个规律发现没,都是0x8000... 都是最高为1,无它为0
原因就是:LONG,INTEGER,CURRENCY都是有符号数,所以无法单独只为符号符为直接赋值。

但下面赋值是可以的
dim MinVal as long
MinVal =&H80000000   '-2147483648
作者: ak47ok    时间: 2015-11-28 13:02
每次回帖、谢谢!辛苦了。




欢迎光临 Office中国论坛/Access中国论坛 (http://www.office-cn.net/) Powered by Discuz! X3.3