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

Shr*_*ers 45 java modulus

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

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

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

Rod*_*own 64

你第一次跑的时候可能有错字.

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

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

  • 浮点计算中总会出现舍入错误。要么采用给定的值,要么将其四舍五入到最接近的必要值。 (4认同)
  • 但是`1.0%0.1`返回...`0.09999999999999995`,这是舍入错误的结果.知道如何纠正这个(大概是用epsilon值?) (3认同)

Mat*_*hen 43

与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

  • 最后一个要点是一面文字.通过一个例子可以更清楚地说:`0.5%0.3 = 0.2`和`(-0.5)%0.3 = -0.2` (5认同)

Whi*_*ind 6

我认为常规模运算符在java中可以用于此,但编码并不困难.只需将分子除以分母,然后取结果的整数部分.乘以分母,并从分子中减去结果.

x = n / d
xint = Integer portion of x
result = n - d * xint
Run Code Online (Sandbox Code Playgroud)