我如何使用模数浮动/双?

时间:2010-06-01 02:53:18

标签: java modulus

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

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

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

4 个答案:

答案 0 :(得分:64)

当你第一次跑步时,你可能有一个错字。

评估0.5 % 0.3按预期返回'0.2'(双倍)。

Mindprod在Java中有一个good overview of how modulus works

答案 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
相关问题