为什么double 1.0等于int 1?

时间:2011-09-17 08:24:27

标签: vb.net

昨天我问为什么加倍10倍0.10到双倍不等于int 1;

in VB Why (1 = 1) is False

我得到了一个很好的答案。概述是因为:

  • 无法直接比较浮点类型和整数类型,因为它们的二进制表示形式不同。
  • 作为浮点类型添加0.1十次的结果可能是接近1的值,但不完全是

我现在可以看到原因。但是,如果我做了类似的事情:

  Dim d As Double

  For i = 1 To 4
        d = d + 0.25
  Next

  MsgBox(d)  'output 1 
  MsgBox(d = 1) 'True
  MsgBox(1 - d) ' 0
  Console.WriteLine(d) '1

在这种情况下,我确实获得了double 1.0和int 1之间的相等。我认为double只是近似值所以我希望d在某种程度上是一个接近1的值,就像在原始的第一个问题中一样。为什么不直接比较不同的数据类型(在这种情况下是双整数)以及为什么我这次获得相等性是不是一个好主意?

2 个答案:

答案 0 :(得分:4)

是的,双打通常都是近似的。但有些数字比其他数字效果更好。

就像十进制数字一样:你可以写1/10精确(0.1),但不能写1/3(0.33333 ......)。

所以碰巧1/4可以精确地转换为二进制浮点数,其中1/10不能。

修改
十进制(浮点)数字的功效为10,所以如果你可以将一些数字写成1 / 10,1 / 100,1 / 1000等的组合(允许的倍数),那么你可以将这个数字精确地写为小数号。

对于二进制浮点数,它的工作原理是相同的,只有序列是1 / 2,1 / 4,1 / 8,1 / 16等。在计算机中,精度有一个限制:一些细节也是如此小到完全代表。

答案 1 :(得分:1)

双精度可以精确表示整数。但是,您可以通过多种方式引入错误,尤其是在使用小于1的值时。例如,这通常会导致x不精确等于1:

x = 1
x = x / 3
x = x * 3

但是在这个例子中,x恰好是3

x = 3
x = x / 3
x = x * 3

如果你希望double有一个整数值,你可以使用Round(x)精确舍入到最接近的整数。

If Round(x) = 1 Then...

What Every Computer Scientist Should Know About Floating-Point Arithmetic对浮点数(这是Double是什么)及其错误有一个非常好的解释。