6

还是有可能操作会失败?

谢谢。

我选择了错误的术语,我真正的意思是四舍五入到 0,而不是截断。

关键是,我需要比较两个双精度的整数部分,我只是将它们转换为 int,然后使用 ==,但是,正如有人在我之前的一个问题中指出的那样,如果double 不能放入整数。

所以问题是'使用 == 运算符比较之前舍入为 0 的两个双精度值是否正确,或者我应该坚持转换为 int 方法并捕获可能的异常?

4

6 回答 6

12

这是更新的站点,它讨论了几种比较浮点数的方法的优缺点。(您仍然可以在此处查看旧网站。)

我要采用的方法是“相对误差”方法。找出两个数字之间的差异,将其转换为数字的百分比,如果这个百分比足够小,那么你就得到了平等。

于 2008-10-25T14:06:35.757 回答
5

更糟糕的是,有时,即使是完全相同的数字,它也会失败。这是因为一些编译器或处理器将在 CPU 寄存器中使用比在内存中更多的精度位(例如,MSVC 有 3 种不同的浮点行为选项)。因此,最近计算的值可能不会截断这些位,并且看起来不相等。永远不要在浮动上使用 ==。

于 2009-03-13T21:48:27.307 回答
4

由于浮点表示的正常问题,它仍然可能失败。与其截断它们,不如使用表示等效精度的增量。

如果您有两个通常认为相同的浮点数,它可能会失败,

10.19999999

10.20000001

但是当你截断它们时,它们会给出不同的结果。

10.19

10.20

然而,如果我使用 0.001 的增量来比较差异,我会发现这两个值实际上是相同的。

于 2008-10-25T13:58:32.890 回答
2

==与浮点一起使用永远不正确。

在浮点上下文中“截断”是什么意思?你在调用什么特定的库函数?结果是什么?是什么让您相信“截断”值比非截断值更具可比性?

浮点数是十进制值的近似值。浮点数只能精确表示二的幂。无论您执行何种浮点运算,所有其他值都会出现一些错误。

但是,如果您转换为整数,则可以使用==.

于 2008-10-25T14:30:27.900 回答
1

http://www.windojitsu.com/code/floatcomparer.html

于 2009-10-28T12:32:15.853 回答
-1

如果你的绝对值小于 2^23 单声道或 2^52 双声道,你可以使用 round() 然后进行比较。较大的值无法精确存储,这适用于 N == N+1 的情况。

于 2008-10-25T14:44:02.000 回答