iT邦幫忙

1

VB 數值看起來一樣,VB卻說不同

#vb
        邊長(1) = 15
        邊長(2) = 21.213
        邊長(3) = 15
        MsgBox(Math.Round((邊長(3) ^ 2 + 邊長(1) ^ 2) ^ 0.5, 3) &
        vbNewLine & 邊長(2) & vbNewLine & "是否相等:" &
        IIf(Math.Round((邊長(3) ^ 2 + 邊長(1) ^ 2) ^ 0.5, 3) = 邊長(2), "true", "fels"))

https://ithelp.ithome.com.tw/upload/images/20191007/20120621T2YstxxS44.png
這數值一樣...
結果卻是...

看更多先前的討論...收起先前的討論...
是否只是看起來一樣
差在形態上?
試試先將結果和被比較的數值統一轉型成float或其他試試?

另外
貼的code跟畫面不太一樣
是否相等code為fels
IIf(Math.Round((邊長(3) ^ 2 + 邊長(1) ^ 2) ^ 0.5, 3) = 邊長(2), "true", "fels"))
可是你的畫面卻是false
邊長(1) = 15
邊長(2) = 21.213
邊長(3) = 15
MsgBox(Math.Round((邊長(3) ^ 2 + 邊長(1) ^ 2) ^ 0.5, 3) &
vbNewLine & 邊長(2) & vbNewLine & "是否相等:" &
IIf(CDec(Math.Round((邊長(3) ^ 2 + 邊長(1) ^ 2) ^ 0.5, 3)) = CDec(邊長(2)), "true", "false"))
我直接宣告三個數字
Dim a = 15
Dim b = 21.213
Dim c = 15
MsgBox(Math.Round((c ^ 2 + a ^ 2) ^ 0.5, 3) & vbNewLine & b & vbNewLine & "是否相等:" & IIf(Math.Round((c ^ 2 + a ^ 2) ^ 0.5, 3) = b, "true", "false"))
答案是true
所以應該是你的邊長1 2 3 型態的問題
小魚 iT邦大師 1 級 ‧ 2019-10-07 18:30:50 檢舉
我得到的也是true
另外通常變數命名盡量不要用中文
無尾熊 iT邦新手 5 級 ‧ 2019-10-07 18:49:38 檢舉
re:Anthony_Yang
我剛剛也這麼想,我是全換single
剛剛全部換double就能了
感覺好神祕
前陣子用C#做小程式時
Array A[0] = 3, Array B[0] = 3
A[0] == B[0] 是false
但是 A[0].ToString() == B[0].ToString() 就是true

猜測是因為A[0]雖然顯示內容是3沒錯
但在比較時看的應該是記憶體位置
故A[0] 不等於 B[0]
0
純真的人
iT邦高手 1 級 ‧ 2019-10-07 23:06:11

剛剛測試你的問題~
是Single比對Double型別,會是false狀態

        Dim 邊長(3) As Single
        邊長(1) = 15
        邊長(2) = 21.213
        邊長(3) = 15
        MsgBox(Math.Round((邊長(3) ^ 2 + 邊長(1) ^ 2) ^ 0.5, 3) &
        vbNewLine & 邊長(2) & vbNewLine & "是否相等:" &
        IIf(Math.Round((邊長(3) ^ 2 + 邊長(1) ^ 2) ^ 0.5, 3) = Math.Round(邊長(2), 3), "true", "fels"))

        邊長(3) = 21.213
        MsgBox(Math.Round(邊長(3), 3) & vbNewLine & 邊長(2) & vbNewLine & "是否相等:" &
        IIf(Math.Round(邊長(3), 3) = 邊長(2), "true", "fels"))

https://ithelp.ithome.com.tw/upload/images/20191007/200613692tQEfZxdPl.png

0
Anthony_Yang
iT邦新手 4 級 ‧ 2019-10-08 10:57:24

是否只是看起來一樣
差在形態上?
試試先將結果和被比較的數值統一轉型成float或其他試試?

邊長(1) = 15
邊長(2) = 21.213
邊長(3) = 15
MsgBox(Math.Round((邊長(3) ^ 2 + 邊長(1) ^ 2) ^ 0.5, 3) &
vbNewLine & 邊長(2) & vbNewLine & "是否相等:" &
IIf(CDec(Math.Round((邊長(3) ^ 2 + 邊長(1) ^ 2) ^ 0.5, 3)) = CDec(邊長(2)), "true", "false"))

個人測試
我直接宣告三個數字

Dim a = 15
Dim b = 21.213
Dim c = 15
MsgBox(Math.Round((c ^ 2 + a ^ 2) ^ 0.5, 3) & vbNewLine & b & vbNewLine & "是否相等:" & IIf(Math.Round((c ^ 2 + a ^ 2) ^ 0.5, 3) = b, "true", "false"))
答案是true
所以應該是你的邊長1 2 3 型態的問題
0
owlfox
iT邦新手 5 級 ‧ 2019-10-08 16:22:31

處理浮點數(float / double)的時候要很小心。
簡單一個問題,請問以下這行會得到什麼?
Debug.Print ((0.1 + 0.2) - 0.3);

你可以看看這篇微軟官方的文章:
https://docs.microsoft.com/zh-tw/dotnet/api/system.double.equals?view=netframework-4.8

或是找找其他人寫好的函式來比較浮點數是否相等/很接近

我要發表回答

立即登入回答