谁能举个例子,说明一下double与currency的精度区别,还是不太明白?
-------------------------------
书上说,定点小数的精度高,浮点数计算有误差.
但是我反复也没有测试出来这种区别.书上说,currency左边15位有效,右边4位有效,但是我无法输入呢?
比如:
dim a as currency
a=123456789123456.1234
按理说应该可以呀,正好是左边15位,右边4位,但是系统会自动修改,将多于15位去除,这是为什么呢?
大家可以试一下

解决方案 »

  1.   


    Dim a As Currency
    a = 123456789123456.1234@
    Debug.Print a
      

  2.   

    常数后面加个@号,告诉编译器,这个数字为currency类型
      

  3.   

    相同的问题http://topic.csdn.net/u/20090128/00/053a117a-7cc2-4de2-a2ce-7552f3d60e1f.html
      

  4.   

    在对小数位数较多且需要精度较高的场合,使用Double+Format
    在对小数位数较低(4)位有效数字之内,且数可能较大的场合,使用currency
    PS:double类型追求的是表数范围,为了追求更大的表数范围,使用指数的形式,舍弃了精度。
    举个例子:   Dim s As String
       s = "12345678912345678912345678"
       MsgBox CDbl(s)你能说这个数很精确吗?
      

  5.   

    jhone99 ,那个问题就是楼主问的.
      

  6.   

    我在
    http://topic.csdn.net/u/20090817/08/b16bdce9-9059-48e4-888c-72254a1b5f1f.html
    中10楼和13楼的例子还不够说明问题吗?精度问题看自己的需要,如果15位或者19位精度还不能满足需求就要自己实现算法了。我在之前的回复中也说过,精度要求再高就需要用字符串或者数组来表示数字了。给个高精度运算例子吧,下面这个例子只实现高精度整数乘法,要加小数点的话自己改改Private Sub Form_Click()
    Dim S1 As String, S2 As String
    S1 = "64651651654486653452363223561543462365461255231665215565234456512634614"
    S2 = "98092831134515152346456486716122343123253344652434652456524565234425634"
    Debug.Print Test(S1, S2)
    End SubFunction Test(ByVal M As String, ByVal N As String) As String
        '用于大整数相乘
        Dim A() As Integer, B() As Integer, S() As Integer
        ReDim A(Len(M)) As Integer, B(Len(N)) As Integer, S(Len(M) + Len(N)) As Integer
        For i = 1 To Len(M)
            A(i) = Val(Mid(StrReverse(M), i, 1))
        Next
        For i = 1 To Len(N)
            B(i) = Val(Mid(StrReverse(N), i, 1))
        Next
        
        For i = 1 To Len(M)
            For j = 1 To Len(N)
                S(i + j - 1) = S(i + j - 1) + A(i) * B(j)
            Next
        Next
        For i = 1 To Len(M) + Len(N)
            If S(i) > 9 Then
                S(i + 1) = S(i + 1) + S(i) \ 10
                S(i) = S(i) Mod 10
            End If
        Next
        For i = Len(M) + Len(N) To 1 Step -1
            Test = Test & IIf(S(i) = 0, " ", S(i))
        Next
        Test = Replace(LTrim((Test)), " ", 0)
    End Function
      

  7.   

    Private Sub Command2_Click() 
        Dim a As Double 
        Dim b As Currency 
        
        Dim i As Integer 
        a = 2.1: b = 2.1 
        For i = 1 To 45 
            a = a * 2.09 
            b = b * 2.09 
        Next 
        Debug.Print a, b 
        '以下是打印结果:为何差这么大呀? 
        '535552646449662            535552446303376.5576 
    End Sub 
    以上代码情况下,我发现double型的直实度更高些. 
    但是没有小数位了,这一点我明白了,将小数位挤没了. 
    而currency却一直有小数位. 但是我不解的是:为何计算结果的真实性,double型是准确的. 
    这两个数差太大了.
      

  8.   

    误差累积造成的,i = 3时,a的精度比b高,接下来的计算里面误差不断累积放大。拜托,能不能不要用currency进行小数运算
      

  9.   

    浮点类型 Double 可以表示的范围更大,但是在该范围内只能用近似值表示,所以说精度低。
    例子Option ExplicitSub Main()
        Dim dbl As Double, cur As Currency
        
        dbl = CDbl("1.79769313486231E+308") - CDbl("4.94065645841247E-324")
        Debug.Print dbl
        
        cur = CCur("922,337,203,685,477.5807") - CCur("0.0001")
        Debug.Print cur
    End Sub
    输出 1.79769313486231E+308 
     922337203685477.5806 
      

  10.   


    问题的本质,在于 Double 是浮点数,而 Currency 是定点数。
    由于二进制小数在表示十进制小数方面的限制,微软也说,Double-precision numbers store an approximation of a real number. 同时特别强调,When you work with floating-point numbers, keep in mind that they do not always have a precise representation in memory. This could lead to unexpected results from certain operations, such as value comparison and the Mod operator.而 Currency 实际上在存储器中,是以整型数保存的,显示和运算时,除以 10000。所以相当于有 4 位小数。所以,它的小数,是精确的十进制小数。