为啥双 1.0 等于 int 1?

Posted

技术标签:

【中文标题】为啥双 1.0 等于 int 1?【英文标题】:why a double 1.0 its equal to an int 1?为什么双 1.0 等于 int 1? 【发布时间】:2011-09-17 08:24:27 【问题描述】:

昨天我问为什么a加10乘以0.10到一个double不等于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 的值,就像最初的第一个问题一样。为什么直接比较不同的数据类型(在这种情况下为双整数)不是一个好主意,为什么我这次获得相等??

【问题讨论】:

尝试比较 dim d as double 和 dim i as Int ,我猜这将是错误的。为了使代码更清晰,需要进行类型转换,以便程序员知道分配了什么? :) 【参考方案1】:

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

就像十进制数一样:您可以精确地写出 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 等。另外,在计算机中,精度有限制:一些细节也只是小到不能准确表示。

【讨论】:

您可能想补充一点,j/(2^k) 形式的任何数字,其中 j 和 k 是整数,都可以精确地表示为浮点数(最多 j 和 k )。【参考方案2】:

double 可以精确地表示整数。但是,您可以通过多种方式引入错误,尤其是在使用小于 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 是什么)及其错误有很好的解释。

【讨论】:

以上是关于为啥双 1.0 等于 int 1?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 unsigned int 0xFFFFFFFF 等于 int -1?

为啥 Math.floor 返回一个双精度值?

python3运算符

为啥 Int8.max &+ Int8.max 等于“-2”?

Python+int('35',8)为啥等于29?

Lesson 1#10 流程控制