vb中有定点小数类型吗?如果对精度要求很高,不能用浮点数如何办呢?

解决方案 »

  1.   

    dim var as Currency
    Currency 数据类型在货币计算与定点计算中很有用,在这种场合精度特别重要。
      

  2.   

    Currency 可以认为是定点类型,但它只能到小数点后 4 位。所以“精度”(如果指的是有效数字位数)很高的话,恐怕要自定类型。
      

  3.   

    精度要求很高才用浮点数,你是不是说不能用指数形式?如是,格式化一下就行了.例如:
    Private Sub Form_Load()
    Dim a As Double
    a = 1 / 3
    a = Format(a, "0.000000000")
    Debug.Print a
    End Sub
      

  4.   

    关键看你的精度要求到多少,Currency的有效位数19位。如果对它定4位小数不满也可以通过计算前将数据进行小数点位置调整,计算后再调回来的办法解决。
    如果需要更高精度就需要自己写算法或者找高精度计算类库了。
      

  5.   

    不是的,你的理解有误的,浮点数是有误差的。但是定点小数是无误差的。
    比如currency没有误差,但是只能有四位小数,如果位数多,如何办呢?
      

  6.   

    双精度不够用?有点可怕!!
    还可以用string,不过效率上差得多.
      

  7.   

    变相对付,用  currency*x 
      

  8.   

    比较以下计算结果:
    Private Sub Form_Load()
    Dim a As Double
    a = 10000000 / 29
    Debug.Print a
    Dim b As Currency
    b = 10000000 / 29
    Debug.Print b
    End Sub
      

  9.   


    换一个角度看这个问题:Private Sub Form_Load()
    Dim a As Double
    Dim b As CurrencyDim i As Integer
    a = 2.1: b = 2.1
    For i = 1 To 48
        a = a * 2
        b = b * 2
    Next
    Debug.Print a, b
    End Sub
      

  10.   

    确实,通过这种测试,发现double的计算精度比currency要高呀,
    为何所有资料上都说currency精度高,用在精度要求极高的场合呢?可是通过测试发现,他的精度不如
    double呀,
    请大家继续发言。
      

  11.   

    double的精度是15位有效数字
    currency 最高精度19位有效数字
    从有效位数来说currency的精度是更高的。但currency设计之初就是为了进行金融货币的计算,并不是为了高精度浮点运算。只要计算结果在他的表示范围内是高精度的,超出4为小数部分不保证。我在10楼的例子就能看出double只能到15位有效数字精度,于是小数点后的那一位被四舍五入了,但是currency却能精确的记录整个结果。9楼的例子呢,用currency得缺点来和double比小数位数。其实只能说明每种变量类型有他自己适应的应用场景,不能如此一概而论。
    如果非要和double比小数位数的计算,可以进行一些变换,把9楼的例子改一改:
    a = 10000000 / 29
    Debug.Print a
    Dim b As Currency
    '先把被除数放大10^9再做除法
    b = 10000000 * 10 ^ 9 / 29
    '现在把结果打印出来看看从有效位数上比double结果多了4位,
    '只需要把小数点往左挪9位就得到比double更高精度的结果了
    Debug.Print b
      

  12.   

    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型是准确的.
    这两个数差太大了.