我正在为学校项目创建一个RPN计算器.我在模数运算符方面遇到了麻烦.由于我们使用的是双数据类型,因此模数不适用于浮点数.例如,0.5%0.3应该返回0.2,但我得到除零异常.
该指令说使用fmod().我到处寻找fmod(),包括javadocs,但我找不到它.我开始认为这是一种我必须创建的方法?
编辑:嗯,奇怪.我只是再次插入这些数字,似乎工作正常......但以防万一.使用浮动类型时,是否需要注意在Java中使用mod运算符?我知道这样的事情不能在C++中完成(我想).
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
我认为常规模运算符在java中可以用于此,但编码并不困难.只需将分子除以分母,然后取结果的整数部分.乘以分母,并从分子中减去结果.
x = n / d
xint = Integer portion of x
result = n - d * xint
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
111410 次 |
| 最近记录: |