如何将模数用于浮点数/双精度数?

新手上路,请多包涵

我正在为一个学校项目创建一个 RPN 计算器,但在使用模数运算符时遇到了问题。由于我们使用的是双精度数据类型,模数不适用于浮点数。例如,0.5 % 0.3 应该返回 0.2,但我得到除以零的异常。

该指令说使用 fmod() 。我到处寻找 fmod() ,包括 javadoc,但找不到。我开始认为这是我必须创建的一种方法?

编辑:嗯,奇怪。我只是再次插入这些数字,它似乎工作正常……但以防万一。使用浮动类型时是否需要注意在 Java 中使用 mod 运算符?我知道这样的事情不能用 C++ 完成(我认为)。

原文由 ShrimpCrackers 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 463
2 个回答

与 C 不同,Java 允许对整数和浮点数使用 % 并且(与 C89 和 C++ 不同)它对所有输入(包括负数)都有明确的定义:

来自 JLS §15.17.3

浮点取余运算的结果由 IEEE 算术规则确定:

  • 如果任一操作数为 NaN,则结果为 NaN。
  • 如果结果不是 NaN,则结果的符号等于被除数的符号。
  • 如果被除数是无穷大,或者除数是零,或者两者都是,则结果为 NaN。
  • 如果被除数是有限的而除数是无穷大,则结果等于被除数。
  • 如果被除数为零且除数有限,则结果等于被除数。
  • 在其余情况下,既不涉及无穷大,也不涉及零,也不涉及 NaN,被除数 n 除以除数 d 的浮点余数 r 由数学关系式 r=n-(d·q ) 其中 q 是一个整数,仅当 n/d 为负时为负,仅当 n/d 为正时为正,并且其大小在不超过 n 和 d 的真实数学商的大小的情况下尽可能大。

因此,对于您的示例,0.50.3 = 1.6…。 q 与 0.5(被除数)同号(正),量级为 1(最大量级不超过 1.6 的整数…),并且 r = 0.5 - (0.3 * 1) = 0.2

原文由 Matthew Flaschen 发布,翻译遵循 CC BY-SA 2.5 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题