我一直在网上搜索,试图以简单的形式理解为什么会出现这种情况。
Dim mysingle As Single = 456.11
Dim mybool As Boolean = mysingle = 456.11
在上面的行中,mybool变得虚假。当我将单个放入双重时,我发现了这种行为,我发现了额外的数字。 .net文档声明单个是一个近似值:S
我是一个单位是32位浮点数吗?但是,当我明确说出这个数字是什么时,为什么会出现额外的数字..当然,内存应该存储我的数字的任何一边的数字是0以填满内存位置?!
我的大脑在这一个上炸了:(
答案 0 :(得分:10)
第二个语句中比较的值不被视为Single
,而是被视为Double
。由于您使用的是VB.NET,因此可以使用!
将其后缀为Single
,这将返回True
:
Dim mysingle As Single = 456.11
Dim mybool As Boolean = mysingle = 456.11!
答案 1 :(得分:9)
我建议阅读:What Every Computer Scientist Should Know About Floating-Point Arithmetic。
详细解释了浮点数学的精度问题。有关上述内容的更简单说明,请参阅The Floating Point Guide。
答案 2 :(得分:1)
理解.NET中浮点的另一个很好的参考:http://www.yoda.arachsys.com/csharp/floatingpoint.html
让我强调他对比较的观点:
所有这一切的一个后果就是 你应该非常非常少 比较二进制浮点数 直接相等的数字。 [...] 这样做的一个简单方法是 从另一个中减去一个,使用 Math.Abs找到绝对值 区别,然后检查是否 这低于一定的容差 水平。强>