在项目中涉及到数值型计算,本来小数位数只有2位,可在定义Decimal类型变量是没有定义精度,导致计算错误。
数据来源至DataWindow中的Number类型。共3组数据4.52,6,10.67。通过循环读取
可读取第一组数据时ldec_upload本应为4.52实际变成了4.519999999999999488随后进行的加减。
分析循环:
第一次循环后:
j = 1
ldec_upload = 4.519999999999999488
ldec_amount = -6.000000000000000512
第二次循环后:
j = 2
ldec_upload = 6.000000000000000000
ldec_amount = -0.000000000000000512
第三次循环后:
j = 3
ldec_upload = 10.67000000000000000
ldec_amount = 10.66999999999999949
从上面的循环中可以看出第三次循环是不应该做的。已正是如此,导致了从数据和代码上没有逻辑错误,但结果错误的结局。
其中还有String(-0.000000000000000512,"0.00")返回的是0.00这更导致了输出结果无法查起,这个判断(If ldec_amount >= 0 Then Exit)显得那么苍白无力。
下面是程序的简化代码:
Integer j
Decimal ldec_upload,ldec_amount = -10.52
String ls_recipno
DataStore ds_mem2
ds_mem2 = Create DataStore
ds_mem2.DataObject = "d_test"
ds_mem2.InsuertRow()...................省略数据插入
For j = 1 To ds_mem2.RowCount()
ldec_upload= ds_mem2.Object.itemnum[j]
If ldec_upload <= 0 Then Continue
ldec_amount = ldec_upload + ldec_amount
If ldec_amount >= 0 Then Exit
Next
Destroy ds_mem2
最后的解决办法是定义Decimal变量时加上精度,比如:Decimal{2} ldec_upload,ldec_amount = -10.52这样控制了精度,问题也就不存在了。
以上问题由于数据一般都是整数,小数的情况很少,前期也没发现该问题,一切正常,问题后不通过Debug是不会发现问题的,DeBug是多么的重要。
在以后的开发中对精度的控制一定得谨慎。
数据来源至DataWindow中的Number类型。共3组数据4.52,6,10.67。通过循环读取
可读取第一组数据时ldec_upload本应为4.52实际变成了4.519999999999999488随后进行的加减。
分析循环:
第一次循环后:
j = 1
ldec_upload = 4.519999999999999488
ldec_amount = -6.000000000000000512
第二次循环后:
j = 2
ldec_upload = 6.000000000000000000
ldec_amount = -0.000000000000000512
第三次循环后:
j = 3
ldec_upload = 10.67000000000000000
ldec_amount = 10.66999999999999949
从上面的循环中可以看出第三次循环是不应该做的。已正是如此,导致了从数据和代码上没有逻辑错误,但结果错误的结局。
其中还有String(-0.000000000000000512,"0.00")返回的是0.00这更导致了输出结果无法查起,这个判断(If ldec_amount >= 0 Then Exit)显得那么苍白无力。
下面是程序的简化代码:
Integer j
Decimal ldec_upload,ldec_amount = -10.52
String ls_recipno
DataStore ds_mem2
ds_mem2 = Create DataStore
ds_mem2.DataObject = "d_test"
ds_mem2.InsuertRow()...................省略数据插入
For j = 1 To ds_mem2.RowCount()
ldec_upload= ds_mem2.Object.itemnum[j]
If ldec_upload <= 0 Then Continue
ldec_amount = ldec_upload + ldec_amount
If ldec_amount >= 0 Then Exit
Next
Destroy ds_mem2
最后的解决办法是定义Decimal变量时加上精度,比如:Decimal{2} ldec_upload,ldec_amount = -10.52这样控制了精度,问题也就不存在了。
以上问题由于数据一般都是整数,小数的情况很少,前期也没发现该问题,一切正常,问题后不通过Debug是不会发现问题的,DeBug是多么的重要。
在以后的开发中对精度的控制一定得谨慎。