【发布时间】:2020-09-11 22:04:56
【问题描述】:
我编写了以下 VB 代码。
Dim qu1, qu2, facroredload, bx, iterations, q3, err As Double
bx = 0.1
qu1 = "constant"
For iterations = 0 To 10000
qu2 = "constant" * bx
q3 = qu1 + qu2
facroredload = "constant" / bx ^ 2
err = Math.Abs(q3 - facroredload)
Select Case err
Case > 10
bx += 0.1
Case err <= 10 And err > 1
bx = bx + 0.01
Case err <= 1 And err > 0.1
bx = bx + 0.001
Case err <= 0.1 And err > 0.01
bx = bx + 0.0001
Case err < 0.01
Exit For
End Select
Next
bx 值达到 1.700000000004(我不知道为什么代码添加了太多小数),然后它永远不会改变。 For 声明仍然令人兴奋,但即使 Case err <= 10 And err > 1 为真,bx 也永远不会超过 1.7。
【问题讨论】:
-
err是Double。err <= 1 And err > 0.1是Boolean。你无法比较它们。转Option Strict On。或者,使用Select Case True而不是Select Case err。 -
开启 Option Strict。一开始可能会很烦人,但它会帮助你避免这种错误,并且在一个月内你会想知道如果没有它你会怎么做。
-
另外...对于“为什么小数太多”的问题,请记住
0.1是1/10th的十进制表示,而计算机会将其存储为二进制。在二进制中,1/10th是一个重复值,类似于在十进制中1/3rd的值。准确存储是不可能的,因此无论何时使用它,最终都会出现小的舍入误差。 -
哦,您希望计算机在将小数与字符串相乘时会做什么?这根本没有意义。
标签: vb.net select-case