谁能举个例子,说明一下double与currency的精度区别,还是不太明白?
-------------------------------
书上说,定点小数的精度高,浮点数计算有误差.
但是我反复也没有测试出来这种区别.书上说,currency左边15位有效,右边4位有效,但是我无法输入呢?
比如:
dim a as currency
a=123456789123456.1234
按理说应该可以呀,正好是左边15位,右边4位,但是系统会自动修改,将多于15位去除,这是为什么呢?
大家可以试一下
-------------------------------
书上说,定点小数的精度高,浮点数计算有误差.
但是我反复也没有测试出来这种区别.书上说,currency左边15位有效,右边4位有效,但是我无法输入呢?
比如:
dim a as currency
a=123456789123456.1234
按理说应该可以呀,正好是左边15位,右边4位,但是系统会自动修改,将多于15位去除,这是为什么呢?
大家可以试一下
解决方案 »
- 为一家密度板做的Case Study:Steaming Tube Lost Plug 与历史趋式曲线控件
- vb中如何实现对音频解码器的调用
- 更深一步请教Richtextbox下解决个别字体颜色设定的方法,在线等.............
- color的结构怎么用?想知道获取的color是不是黑色的
- 各位高手,请教一个问题,望多多指教!!!在先等候1
- 关于指针,请大家看看,调用对吗?
- 识别MDIform的子窗体的激活状态
- 高分赠与精通vb网络编程--关于多线程下载的问题
- 高分求一个类式QQ列表控件
- 如何用 vb 代码,替换word模版。
- ############## VB中如何使用escape? ########################
- vb6实现多图片上传,使用什么控件?
Dim a As Currency
a = 123456789123456.1234@
Debug.Print a
在对小数位数较低(4)位有效数字之内,且数可能较大的场合,使用currency
PS:double类型追求的是表数范围,为了追求更大的表数范围,使用指数的形式,舍弃了精度。
举个例子: Dim s As String
s = "12345678912345678912345678"
MsgBox CDbl(s)你能说这个数很精确吗?
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
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型是准确的.
这两个数差太大了.
例子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
问题的本质,在于 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 位小数。所以,它的小数,是精确的十进制小数。