【问题标题】:Remainder of float division浮点除法余数
【发布时间】:2012-01-08 01:29:31
【问题描述】:

如何计算两个floats 相除的余数?

【问题讨论】:

标签: objective-c


【解决方案1】:

a-floor(a/b)*b 怎么样 - 假设 ab 都是正面的?

您可以说“余数”不是浮点除法的正确概念,但我会让您自己判断。

【讨论】:

  • 对于99.60.2,我不断获得0.2 的值——当然它应该是0,就像996%2 是0一样。
【解决方案2】:

使用fmod,计算浮点模数。

double remainder = fmod(a_double, another_double);

如果您想使用float 代替double,您可以使用fmodf

【讨论】:

  • fmod( 97.2, 0.2 ) 返回0.2,这不是很有用。
  • @TomášZato 这里的问题是 97.2 和 0.2 都不能准确地表示为浮点数。见Why Are Floating Point Numbers Inaccurate?。在我的调试器中,我得到97.2000000000000020.20000000000000001 作为参数,结果是0.19999999999999746。您可能需要一个定点数学库来解决您的案例。
  • 我想这也解释了为什么做if( remainder==0 || remainder==another_double) 也失败了,因为0.19999999999999746 不等于0.2。我将比较数字之间的差异。
  • 这不适用于负值,因为模并不会真正返回余数。 (它在数学中是这样,但在 C 中不是)即使这是更常见的解决方案,接受的答案也适用于所有值,这会给你带来麻烦。当然,如果您知道所有值都将 > 0,那么这是一条更容易的路线。
  • (-1)%4 例如是 3,但在 Obj-C 中你会得到否定的答案。 fmod() 也会发生这种情况。太可惜了。
猜你喜欢
  • 2023-02-14
  • 1970-01-01
  • 2011-05-06
  • 1970-01-01
  • 2011-10-25
  • 1970-01-01
  • 1970-01-01
  • 2012-03-05
  • 2014-01-30
相关资源
最近更新 更多