一个远远超出long范围的数进行计算怎么办??
不要告诉我用currency类型或另外一些数据类型代替,
这个数值超出所有数据类型的范围~有什么办法~?

解决方案 »

  1.   

    2楼的兄弟也说得太随便了吧~~
    我查阅了MSDN,在vb6.0中,最大范围的数据类型就是Variant(字符)莫过于0到20亿的的范围(跟变长string一样)~!现在的数字运算超过20亿的时候简直就是多如繁星!再说这根本不是钻牛角尖的问题!如果没有深入的探究,哪有现在科技?苹果就是会掉下来,为什么就只有有牛顿发现万有引力?如果有好的方法请具体提出,我会非常感谢!!!不要在那里卖关子!没贡献的就不要在这里大言不惭~!
      

  2.   

    我说楼主,你知道20亿才用几位十进制数就能表示吗?10位,区区十位!半个字节就能表示一个16进制数,这才几个字节就能表20亿了,你知道一个string类型有多少字节吗?快到2GB了,如果用它表示数字,你能告诉我哪是多大的数吗?苹果掉下来,砸醒你了吗?
      

  3.   

    baidu 了一下:"大数计算 vb"源代码都直接可以下载:http://www.pediy.com/bbshtml/BBS5/pediy50393.htm
      

  4.   

    dim v as variant
    v = CDec(&H7FFFFFFF) * CDec(&H7FFFFFFF)
    debug.print v
      

  5.   

    比如声明一个长度为40的数组 data[40],其值为:for(int i=0;i<40;i++){
      data[i]=0;
    }在每一个数组元素中保存大整型数的一位,这里就可以保存一个40位长度的整型数运算的时候从数组的第一个元素开始计算,小于10则储存在数组这一位中,大于10则需要进位了进位的运算规则为:当前元素保留        当前值 %10
    当前元素+1保留    原本已有的值+当前值 /10比如说有4  3  2  1
    0  0  0  0这样一个数组
    保存了 1119 这个数当前数据结构为:4  3  2  1
    1  1  1  9现在需要给这个数加上5则 最低位为 9+5 =14则当前数据结构为:4  3  2  1
    1  1  1 14第一位已经超过了10,所以需要进位
    则按照上面的规则第一位=当前值 % 10
    14%10=4
    第二位=原本已有的值+当前值 / 10
    1+14/10=2所以数据结构调整为4  3  2  1
    1  1  2  4这样就可以保存很长的(只要你内存足够大)的整型数了.
      

  6.   

    不知道我的想法是不是正确的,希望大家指正~~按我的理解,"变量类型",只不过是定义好的一段内存比如,VB里的LONG,占4个字节,声明为LONG,只是说明一下"从这个地址开始的四个字节是这个变量"...因此,我认为楼主完全可以自定义一段内存,再写四个专用函数用于操作它(加,减,乘,除)至于大小,分配个几十上百兆字节不成问题(虽然有4G的地址空间,不过不知道能分配多少,呵呵).能表示的十进制值 = 256 ^ 字节数比如,4个字节,那就是256^4=4294967296而LONG是有符号数,那么只能表示20亿左右(把上面的值除二).自己算算1K字节时能表示多少吧,呵呵希望这样能够你用的:)
      

  7.   

    自己看看 MSDN 中标题为“Decimal Data Type”的 VB 帮助,除非精度还不够,否则这是 VB 中最快的大数运算方式
      

  8.   

    整形的的声明为__int64 a; 或 INT64 a;
    浮点型的可声明为 double a;这两种都是64位字长
      

  9.   

    Check:
    BigMath 1.1 (updated July 8, 2007)
    http://www.Planet-Source-Code.com/vb/scripts/ShowCode.asp?txtCodeId=68710&lngWId=1
      

  10.   

    数据类型  存储空间大小 范围 Byte 1 个字节 0 到 255 
    Boolean 2 个字节 True 或 False 
    Integer  2 个字节 -32,768 到 32,767 
    Long
    (长整型) 4 个字节 -2,147,483,648 到 2,147,483,647 
    Single 
    (单精度浮点型) 4 个字节 负数时从 -3.402823E38 到 -1.401298E-45;正数时从 1.401298E-45 到 3.402823E38 
    Double 
    (双精度浮点型) 8 个字节 负数时从 -1.79769313486232E308 到 
    -4.94065645841247E-324;正数时从4.94065645841247E-324 到 1.79769313486232E308 
    Currency 
    (变比整型) 8 个字节 从 -922,337,203,685,477.5808 到 922,337,203,685,477.5807 
    Decimal 14 个字节 没有小数点时为 +/-79,228,162,514,264,337,593,543,950,335,而小数点右边有 28 位数时为 +/-7.9228162514264337593543950335;最小的非零值为 +/-0.0000000000000000000000000001 
    Date 8 个字节 100 年 1 月 1 日 到 9999 年 12 月 31 日 
    Object 4 个字节 任何 Object 引用 
    String 
    (变长) 10 字节加字符串长度 0 到大约 20 亿 
    String
    (定长) 字符串长度 1 到大约 65,400 
    Variant
    (数字) 16 个字节 任何数字值,最大可达 Double 的范围 
    Variant
    (字符) 22 个字节加字符串长度 与变长 String 有相同的范围 
    用户自定义
    (利用 Type) 所有元素所需数目 每个元素的范围与它本身的数据类型的范围相同。 
    4楼的哥哥~上面的资料是从MSDN中的,我怎样找也找不到2GB大的数据类型~请问你从那里看到的~???多谢各位的帮助不过问题还是没有解决~上面提出用数组的方法我想过~不过我要将这个数现实出来,就要把他们加起来~一加起来~还不是一样溢出?
      

  11.   

    Check:
    BigMath 1.1 (updated July 8, 2007)
    http://www.Planet-Source-Code.com/vb/scripts/ShowCode.asp?txtCodeId=68710&lngWId=1
      

  12.   

    String 
    (变长) 10 字节加字符串长度 0 到大约 20 亿 
    Variant
    (字符) 22 个字节加字符串长度 与变长 String 有相同的范围 
    用户自定义
    (利用 Type) 所有元素所需数目 每个元素的范围与它本身的数据类型的范围相同。 
    -------------
    你说20亿字节是多少GB?用计算器算一下吧
      

  13.   

    4楼的哥哥~上面的资料是从MSDN中的,我怎样找也找不到2GB大的数据类型~请问你从那里看到的~???
    String 
    (变长) 10 字节加字符串长度 0 到大约 20 亿
    ==========================================
    2GB在这里多谢各位的帮助不过问题还是没有解决~上面提出用数组的方法我想过~不过我要将这个数现实出来,就要把他们加起来~一加起来~还不是一样溢出?
    ==================================
    楼主好像还没有弄明白
    用字符串做大数运算,参与运算的数和计算结果都是保存在字符串中
    不会出现把整个结果直接转化为long或者double之类的操作
    显示结果仅仅是输出一个字符串而已,怎么会溢出呢
      

  14.   

    楼主好像还没有弄明白
    用字符串做大数运算,参与运算的数和计算结果都是保存在字符串中
    不会出现把整个结果直接转化为long或者double之类的操作
    显示结果仅仅是输出一个字符串而已,怎么会溢出呢
    =========================================
    字符串不能运算啊~~
      

  15.   

    木头做的算盘都能运算
    硅晶做的电脑反而做不到吗?
    //
    哈哈,经典!!!
    \\
    fxy_2002(阿勇)的星星
    //
    对哦,阿勇什么时候变猩猩了啊!!都不散点分来~~~
      

  16.   

    我变猩猩好多年!
    大伙再大方点,过两天偶就有两只猩猩了。:)VB版还有个阿勇,与我无关。此阿勇非彼阿勇!:-P
      

  17.   

    fxy_2002(阿勇) 升猩猩是很久以前的事儿了!
    我这个阿勇就不行了!
    -------------
    楼主,我写个最简单的字符串加法运算
    Private Sub Form_Load()
    '一个简的大数加法,没有详细考虑,可能不周全
    Dim str1 As String, str2 As String, strResult As String
    Dim tmp1 As Integer, tmp2 As Integer, flag As Integer, l As Long
    Dim i As Long
    str1 = "11123345643653464564364368"
    str2 = "17867888888888889"
    l = IIf(Len(str1) > Len(str2), Len(str2), Len(str1))
    i = l
    Do While i > 0
        tmp1 = Val(Mid(Right(str1, l), i, 1))
        tmp2 = Val(Mid(Right(str2, l), i, 1))
        strResult = CStr((tmp1 + tmp2 + flag) Mod 10) & strResult
        i = i - 1
        If tmp1 + tmp2 + flag > 9 Then flag = 1 Else flag = 0
    Loop
    If l < Len(str1) Then strResult = Mid(str1, 1, Len(str1) - l) & strResult
    If l < Len(str2) Then strResult = Mid(str2, 1, Len(str2) - l) & strResult
    Debug.Print strResult
    End Sub
      

  18.   

    晕~成了聊天的地方了~
    感谢两位啊勇拉~搞懂了~
    不过啊勇的例子有一个BUG
    当最大位相加大于10时(即i=1时),下一位就没有加1~~
    ^-^
    不过已经懂了~~感谢~结贴~