设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

返回列表 发新帖
查看: 4054|回复: 7
打印 上一主题 下一主题

[模块/函数] 邪门了:VBA为什么用Currency型不能表达-922337203685477.5808(银行欠我的钱)

[复制链接]
跳转到指定楼层
1#
发表于 2015-5-30 09:22:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 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@




分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 分享淘帖 订阅订阅
2#
 楼主| 发表于 2015-5-30 09:23:24 | 只看该作者
本帖最后由 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@

点击这里给我发消息

3#
发表于 2015-5-30 09:38:23 | 只看该作者
双精度是否可以?
4#
发表于 2015-5-30 11:48: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

5#
 楼主| 发表于 2015-5-30 19:51:48 | 只看该作者
tmtony 发表于 2015-5-30 09:38
双精度是否可以?

双精度只支持48位,我这里有64位
6#
 楼主| 发表于 2015-5-30 20:55:54 | 只看该作者
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(如果输入有小数,则转换取整)
7#
 楼主| 发表于 2015-5-31 17:49:47 | 只看该作者
邪门的事情也发生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
8#
发表于 2015-11-28 13:02:14 | 只看该作者
每次回帖、谢谢!辛苦了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|站长邮箱|小黑屋|手机版|Office中国/Access中国 ( 粤ICP备10043721号-1 )  

GMT+8, 2024-5-6 04:08 , Processed in 0.089205 second(s), 31 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表