我只是在测试一个我在项目中使用的量化器类,并模拟一个相对精细的数字范围(对于要量化为离散步骤的类),我使用Double作为For ... Next循环递增值.像这样:
For d As Double = 0 To 1 Step 0.01
' logic here
Next
Run Code Online (Sandbox Code Playgroud)
结果不是我对量化器所期望的结果,并且在试图弄清楚量化逻辑错误的地方时,我摸不着头脑.最后,我简单地转储了循环产生的数字,几乎只是为了它的地狱.令我惊讶的是,上面的循环没有以0.01的精确步长产生一系列数字.
这是我使用的循环:
For d As Double = 0 To 1 Step 0.01
Me.TextBox1.AppendText(d.ToString & vbCrLf)
Next
Run Code Online (Sandbox Code Playgroud)
这是它打印的数字列表:
0
0.01
0.02
0.03
0.04
0.05
0.06
0.07
0.08
0.09
0.1
0.11
0.12
0.13
0.14
0.15
0.16
0.17
0.18
0.19
0.2
0.21
0.22
0.23
0.24
0.25
0.26
0.27
0.28
0.29
0.3
0.31
0.32
0.33
0.34
0.35
0.36
0.37
0.38
0.39
0.4
0.41
0.42
0.43
0.44
0.45
0.46
0.47
0.48
0.49
0.5
0.51
0.52
0.53
0.54
0.55
0.56
0.57
0.58
0.59
0.6
0.61
0.62
0.63
0.64
0.65
0.66
0.67
0.68
0.69
0.7
0.71
0.72
0.73
0.74
0.75
0.76
0.77
0.78
0.79
0.8
0.810000000000001
0.820000000000001
0.830000000000001
0.840000000000001
0.850000000000001
0.860000000000001
0.870000000000001
0.880000000000001
0.890000000000001
0.900000000000001
0.910000000000001
0.920000000000001
0.930000000000001
0.940000000000001
0.950000000000001
0.960000000000001
0.970000000000001
0.980000000000001
0.990000000000001
Run Code Online (Sandbox Code Playgroud)
显然,直到0.8,这是我的预期,但在那之后..发生了什么?将循环的上限从1增加到3,将在某些时间间隔显示相似的不精确数字带.我是否必须将循环重写为这样的东西?
Dim d As Double
For i As Integer = 0 To 100
d = i / 100
' logic here
Next
Run Code Online (Sandbox Code Playgroud)
浮点数(作为双精度数)是近似值.系统用于0.8的近似值加上系统用于0.01的近似值接近0.810000000000001而不是0.81.如果你想要这样,就像你自己建议的那样,使用整数
For i As Int = 0 To 100
Dim d as Double = i/100.0
' logic here
Next
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
947 次 |
最近记录: |