如何使用float / double模数?
我正在为一个学校项目创build一个RPN计算器。 模运算符有问题。 由于我们使用双数据types,因此模数不适用于浮点数。 例如,0.5%0.3应该返回0.2,但是我得到一个除零的例外。
该指令说使用fmod()。 我到处寻找fmod(),包括javadocs,但我找不到它。 我开始认为这是一种我将不得不创造的方法?
编辑:嗯,奇怪。 我只是再次插入这些数字,似乎工作正常…但以防万一。 在使用浮动types时,我需要注意在Java中使用mod运算符吗? 我知道这样的东西不能用C ++来完成(我认为)。
你第一次运行时可能有一个错字。
评估0.5 % 0.3
如预期的那样返回“0.2”(A双)。
Mindprod 很好地概述了模块如何在Java中工作(最后看浮点模数)。
与C不同的是,Java允许使用整数和浮点数的百分比(不像C89和C ++),它对于所有的input(包括负数)都是明确定义的:
根据JLS§15.17.3 :
浮点余数运算的结果由IEEEalgorithm的规则确定:
- 如果任一操作数是NaN,则结果是NaN。
- 如果结果不是NaN,则结果的符号等于股息的符号。
- 如果股息是无限的,或者除数是零,或者两者都是,则结果是NaN。
- 如果股息是有限的,除数是无穷大,结果等于股息。
- 如果股息为零,除数是有限的,则结果等于股息。
- 在其余的情况下,既不包括无穷大也不包括零,也不包含NaN,除数n除以除数d的浮点余数r由math关系r = n-(d·q )其中q是一个整数,只有在n / d是负数时才是负数,只有当n / d是正数时才是正数,并且其幅度尽可能大而不超过n和d的真实math商数的大小。
所以对于你的例子,0.5 / 0.3 = 1.6 …。 q具有与0.5(被除数)相同的符号(正数),数值为1(最大数量级不超过1.6 …的整数),r = 0.5 – (0.3 * 1)= 0.2
我认为正则模运算符将在java中为此工作,但它不难编码。 只要用分子除分子,取结果的整数部分即可。 乘以分子,并从分子中减去结果。
x = n / d xint = Integer portion of x result = n - d * xint
fmod
是处理浮点模数的标准C函数; 我想你的来源是说Java处理浮点模数与C的fmod
函数相同。 在Java中,您可以使用与运算符相同的%
运算符:
int x = 5 % 3; // x = 2 double y = .5 % .3; // y = .2