如何将模量用于浮点/双模?

2022-08-31 20:06:29

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

说明说要使用 。我到处寻找,包括javadoc,但我找不到它。我开始认为这是我必须创造的方法吗?fmod()fmod()

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


答案 1

您第一次运行它时可能有一个拼写错误。

评估按预期返回“0.2”(双精度值)。0.5 % 0.3

Mindprod很好地概述了模数在Java中的工作原理。


答案 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.5/0.3 = 1.6....q与0.5(股息)具有相同的符号(正),并且幅度为1(最大幅度不超过1.6...的整数),r = 0.5 - (0.3 * 1) = 0.2