取整函数有多个,int向零截断;nint和anint选择最近整数值,恰好等距时取绝对值较大的整数;floor取不大于参数的最大整数,ceiling取不小于参数的最小整数。其中anint返回实数,其余函数在本文用法中返回整数。fortran取整函数不仅返回值不同,取整方向和结果类型也不同。
适用场景
- 把测量值或计算结果归到最近的整数刻度时使用nint;后续仍需保持实数运算时可使用anint。
- 根据坐标确定其所在网格区间时常使用floor,它对负坐标仍沿负无穷方向取整。
- 计算至少需要多少个容器、计算节点或固定长度时间段时使用ceiling,确保容量能够覆盖总需求。
- int适合明确需要趋零截断或进行类型转换的情况,不应把它当作通用四舍五入函数。
语法结构
integerResult = int(realValue [, kind])
integerResult = nint(realValue [, kind])
realResult = anint(realValue [, kind])
integerResult = floor(realValue [, kind])
integerResult = ceiling(realValue [, kind])
可选的kind指定结果种类:对int、nint、floor和ceiling而言是整数种类;对anint而言是实数种类。转换结果必须能由所选整数种类表示,否则结果不可靠。
本文代码
! 用正数、负数和半整数比较不同取整规则。
program roundingDemo
implicit none
real, parameter :: values(*) = [3.6, -3.6, 2.5, -2.5]
integer :: i
print "(A)", " value int nint floor ceiling anint"
do i = 1, size(values)
print "(F6.1,4(2X,I5),2X,F7.1)", values(i), int(values(i)), &
nint(values(i)), floor(values(i)), ceiling(values(i)), anint(values(i))
end do
end program roundingDemo
编译运行
(base) hong@hongdeMacBook-Pro 044.rounding % gfortran -Wall -Wextra -std=f2018 exampleRounding.f90
(base) hong@hongdeMacBook-Pro 044.rounding % ./a.out
value int nint floor ceiling anint
3.6 3 4 3 4 4.0
-3.6 -3 -4 -4 -3 -4.0
2.5 2 3 2 3 3.0
-2.5 -2 -3 -3 -2 -3.0
现象分析
对3.6,趋零与向下都得到3,最近整数与向上都得到4;仅看正数无法分辨这些规则。换成-3.6后差异出现:int趋近零得到-3,floor沿负无穷方向得到-4,ceiling沿正无穷方向得到-3,而最近整数是-4。
2.5与整数2、3距离相同,nint和anint选择远离零的3;-2.5位于-2与-3中间,因此选择-3。这不是“总向上”或“总向下”,而是最近整数规则在等距情况下的规定。
nint与anint的数值选择相同,但表中前者显示为3和-3,后者显示为3.0和-3.0,因为前者返回整数,后者返回实数。输出格式只用于展示这种类型差异,不影响取整结果。
核心知识点
- int趋向零,floor趋向负无穷,ceiling趋向正无穷。
- nint与anint取最近整数值;半整数等距时远离零。
- nint返回整数,anint返回实数,选择函数时必须同时考虑规则和结果类型。
- 负数最能暴露趋零、向下和向上的区别,验证取整逻辑时不应只测试正数。