在下面的代码中,我想生成一个小数点后有两位数的随机数。例如,我想要一个随机变量给出(0.26)而不是(0.26463)。
这是我的代码:
PROGRAM alaki
IMPLICIT NONE
REAL :: RANDOMREAL
CALL RANDOM_SEED()
CALL RANDOM_NUMBER(RANDOMREAL)
PRINT *, "random number= ", RANDOMREAL
END PROGRAM alaki
答案 0 :(得分:0)
在Fortran中没有任何浮点数带有两个小数位。如果您需要更改从某个函数获得的值,则必须自己对其进行舍入。您可能想要创建一个包装原始函数的函数。
四舍五入可能如下:
rounded = real(nint(randomreal * 100)) / 100
答案 1 :(得分:0)
这是你的意思吗?
program alaki
implicit none
real :: randomreal, roundedrandomreal
integer :: i
character(*), parameter :: fmt = "(a,i2,a,g0,a,g0)"
call random_seed()
do i = 1, 10
call random_number(randomreal)
roundedrandomreal = nint(randomreal * 100) / 100.0
write(*, fmt) "[", i, "]: ", randomreal, " -> ", roundedrandomreal
end do
end
这是最新gfortran的可能输出:
[ 1]: 0.228682280 -> 0.230000004
[ 2]: 0.765717089 -> 0.769999981
[ 3]: 0.183222830 -> 0.180000007
[ 4]: 0.144763827 -> 0.140000001
[ 5]: 0.710479259 -> 0.709999979
[ 6]: 0.108196735 -> 0.109999999
[ 7]: 0.802814901 -> 0.800000012
[ 8]: 0.873218477 -> 0.870000005
[ 9]: 0.833641887 -> 0.829999983
[10]: 0.522882819 -> 0.519999981
您可以注意到,即使进行了这些计算,您也不会获得正确的数字,该数字在右侧用全零表示,只是因为十进制数字的机器表示始终是一个近似值(这就是为什么我不了解您后续计算的逻辑,却无法理解您要执行的操作)。如果要提高精度,可以更改实型的种类参数。