或者操作是否有可能失败?

感谢。

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

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

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

有帮助吗?

解决方案

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

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

其他提示

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

由于浮点表示的正常问题,它仍然可能失败。不要截断它们,而是使用代表等效精度的delta。

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

  
    

10.19999999

         

10.20000001

  

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

  
    

10.19

         

10.20

  

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

== 与浮点值一起使用是绝对正确的。

“截断”是什么在浮点背景中意味着什么?您调用了哪些特定的库函数?结果是什么?是什么让你相信“截断”?值是否比非截断值更具可比性?

浮点是十进制值的近似值。浮点只能精确表示两个幂。无论你做什么浮点操作,所有其他值都会出现一些错误。

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

如果你的absolut值小于2 ^ 23为单,或者^ ^ 52为double,你可以使用round()然后进行比较。 无法精确存储较大的值,并且在N == N + 1的情况下会打开。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top