我正在为学校项目创建一个RPN计算器。我在模数运算符方面遇到了麻烦。由于我们使用的是双数据类型,因此模数不适用于浮点数。例如,0.5%0.3应该返回0.2,但我得到除零异常。
指令说使用fmod()。我到处寻找fmod(),包括javadocs,但我找不到它。我开始认为这是一种我必须创建的方法吗?
编辑:嗯,奇怪。我只是再次插入这些数字,似乎工作正常......但以防万一。使用浮动类型时,是否需要注意在Java中使用mod运算符?我知道这样的事情不能在C ++中完成(我认为)。答案 0 :(得分:64)
答案 1 :(得分:41)
与C不同,Java允许对整数和浮点使用%,并且(与C89和C ++不同)它适用于所有输入(包括底片):
来自JLS §15.17.3:
浮点的结果 余数运算由 IEEE算法规则:
- 如果任一操作数为NaN,则结果为NaN。
- 如果结果不是NaN,则结果的符号等于符号 红利。
- 如果被除数是无穷大,或除数是零,或两者兼而有之 结果是NaN。
- 如果被除数是有限的,除数是无穷大,结果 等于股息。
- 如果被除数为零且除数是有限的,则为结果 等于股息。
- 在其余的情况下,既不是无穷大,也不是零,也不是 NaN参与了浮点运动 余数r来自a的划分 n除以除数d 通过数学关系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
答案 2 :(得分:6)
我认为常规模数运算符在java中可以用于此,但编码并不困难。只需将分子除以分母,然后取结果的整数部分。乘以分母,并从分子中减去结果。
x = n / d
xint = Integer portion of x
result = n - d * xint
答案 3 :(得分:3)
fmod
是处理浮点模数的标准C函数;我想你的来源是说Java处理浮点模数与C的fmod
函数相同。在Java中,您可以使用%
运算符,使用与整数相同的双精度数:
int x = 5 % 3; // x = 2
double y = .5 % .3; // y = .2