或者操作是否有可能失败?
感谢。
我选择了错误的术语,我真正的意思是四舍五入到0,而不是截断。
关键是,我需要比较两个双精度的整数部分,我只是将它们转换为int然后使用==,但是,正如有人在我之前的一个问题中指出的那样,这可能会引发溢出如果double不能适合整数,则为异常。
所以问题是'使用==运算符来比较之前舍入为0的两个双精度是否正确,或者我应该坚持使用cast to int方法并捕获可能的异常?
答案 0 :(得分:12)
Here's the updated site讨论了几种比较浮点数的方法的优缺点。 (您仍然可以查看old site here。)
我采用的方法是“相对错误”方法。找出两个数字之间的差异,将其转换为数字的百分比,如果该百分比足够小,那么你就是平等。
答案 1 :(得分:5)
更糟糕的是,有时,即使是完全相同的数字,它也会失败。这是因为某些编译器或处理器将在CPU寄存器中使用比在存储器中更多的精度位(例如,MSVC具有3个不同的浮点行为选项)。因此,最近计算的值可能不会截断这些位并且看起来不相等。永远不要在浮动上使用==。
答案 2 :(得分:4)
由于浮点表示的正常问题,它仍然可能失败。不要截断它们,而是使用代表等效精度的delta。
如果您有两个通常认为相同的花车,它可能会失败,
10.19999999
10.20000001
但是当你截断它们时,它们会给出不同的结果。
10.19
10.20
然而,如果我使用0.001的差值来比较差异,我会看到这两个值实际上是相同的。
答案 3 :(得分:2)
将==
与浮点值一起使用是绝对正确的。
“truncate”在浮点上下文中的含义是什么?您调用了哪些特定的库函数?结果是什么?是什么让你相信“截断”值比非截断值更具可比性?
浮点是十进制值的近似值。浮点只能精确表示两个幂。无论你做什么浮点操作,所有其他值都会出现一些错误。
但是,如果转换为整数,则可以使用==
。
答案 4 :(得分:1)
答案 5 :(得分:-1)
如果你的absolut值小于2 ^ 23为单,或者^ ^ 52为double,你可以使用round()然后进行比较。 无法精确存储较大的值,并且在N == N + 1的情况下会打开。