# Re: 型态问题！！

Posted by 琏琏 on October 12, 1999 at 10:11:14:

In Reply to: 型态问题！！ posted by 小豪 on October 12, 1999 at 05:54:52:

: 小弟有一大问题！请各位高手帮忙：

: 我程式中有一if判断式如下:

: If x1 >= x2 / 10 then
: 事件一
: Else
: 事件二
: End If

: x1,x2变数之型态皆设为single
: 在执行到这行时，x1之值明明已经等于x2之值 (皆等于 0.03025 )
: 为何程式却去做"事件二"而不做"事件一"
: why?有人说是因为型态的问题！
: 说VB在做完运算后资料型态会改变，真的吗?
: 我这问题又该如何解决?
: 拜托高手帮帮忙！！谢谢！！

x1=x2 时, 你的 x2 不是还除以 10 吗?
=> True => 事件一
若你的意思是
x1=(x2/10)=0.03025 , 那最好先在此行设中断点, 确认即时值 (Shift+F9) 是否 x1=0.03025, x2/10=0.03025 但 (x1 = x2 / 10)? 若是则继续看
--
Dim x1 As Single, x2 As Single
x1 = 0.03025
x2 = 0.3025
Debug.Print (x1 >= (x2 / 10))
--
传回 False ... 你的问题或许是这个...
检查此时 x1 , 及 x2/10 在记忆体中的值
Debug.Print VariantToHex(x1), VariantToHex(x2 / 10)
传回
x1=3CF7CED9, x2/10=3CF7CEDA
很明显的 x1 < x2/10

这个叫做计算机误差或进位误差, 详情请参见数值分析的书, 我国文不好, 不会解释...
关于 VariantToHex 请参阅培基语言网页
---
最后解决方案...
说法众说纷纭, 我只简单的举一种方法: 提高精度在做判别时再做型别转换!
--
Dim x1 As Double, x2 As Double
x1 = 0.03025
x2 = 0.3025
Debug.Print (csng(x1) >= csng(x2 / 10))
--
大概就这样!
不要问我为什么... 自己去找数值分析的书!

- 培基语言

Follow Ups:

- Re: 型态问题！！ 小豪 17:13:20 10/13/99 (0)