昨天我问为什么加倍10倍0.10到双倍不等于int 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的值,就像在原始的第一个问题中一样。为什么不直接比较不同的数据类型(在这种情况下是双整数)以及为什么我这次获得相等性是不是一个好主意?
答案 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是什么)及其错误有一个非常好的解释。