gpt4 book ai didi

vb6 - VB6 中的 float 比较

转载 作者:行者123 更新时间:2023-12-04 21:20:28 26 4
gpt4 key购买 nike

在 VB6 中测试两个 Singles 是否相等的最佳方法是什么?

我想测试两个 Single 值是否等于 7 位有效数字。

This MSDN article建议使用类似的东西

If Abs(a - b) <= Abs(a / 10 ^ 7) Then
valuesEqual = True
End If

但是,对于某些值,这可能会失败,例如

Public Sub Main()

Dim a As Single
Dim b As Single

a = 0.50000005
b = 0.50000014

Debug.Print "a = " & a
Debug.Print "b = " & b
Debug.Print "a = b: " & (a = b)
Debug.Print "SinglesAreEqual(a, b): " & SinglesAreEqual(a, b)

// Output:
// a = 0.5000001
// b = 0.5000001
// b = b: False
// SinglesAreEqual(a, b): False

End Sub

Private Function SinglesAreEqual(a As Single, b As Single) As Boolean

If Abs(a - b) <= Abs(a / 10 ^ 7) Then
SinglesAreEqual = True
Else
SinglesAreEqual = False
End If

End Function

我发现获得所需结果的最简单方法是将值转换为字符串,但看起来非常难看:

Private Function SinglesAreEqual(a As Single, b As Single) As Boolean

SinglesAreEqual = (Str$(a) = Str$(b))

End Function

有没有更好的方法?

最佳答案

我维护一个 CAD/CAM 应用程序,我必须一直处理 float 。我有一个称为 fComp 的函数,当我需要测试是否相等时,我会传递一个浮点值。 fComp 调用设置为特定精度级别的舍入函数。对于我们的系统,我四舍五入到小数点后 6 位。您可能需要更高的或更低的,这取决于应用程序。

fComp 函数存在,所以我有一个地方可以更改这些计算中使用的舍入因子。几年前,当我们开始制造更高精度的机器时,这证明很方便。

Public Function pRound(ByVal Value As Double, ByVal Power As Double) As Double
Dim TempValue As Double
Dim tSign As Double
TempValue = Value
tSign = TempValue
TempValue = Abs(TempValue)
TempValue = TempValue * 10 ^ (Power * -1)
TempValue = Fix(TempValue + 0.5)
TempValue = TempValue / 10 ^ (Power * -1)
pRound = TempValue * Sign(tSign)
End Function

四舍五入到小数点后6位

RoundedNumber = pRound(MyValue, -6)

负数是小数点右边左边是正数

关于vb6 - VB6 中的 float 比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3658795/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com