Floating point 如何在fortran中控制rand函数的小数位数?

Floating point 如何在fortran中控制rand函数的小数位数?,floating-point,fortran,precision,Floating Point,Fortran,Precision,在下面的代码中,我想生成一个小数点后有两位数字的随机数。例如,我希望随机变量给出(0.26)而不是(0.26463) 这是我的代码: PROGRAM alaki IMPLICIT NONE REAL :: RANDOMREAL CALL RANDOM_SEED() CALL RANDOM_NUMBER(RANDOMREAL) PRINT *, "random number= ", RANDOMREAL END PROGRAM alaki 在Fortran语言中,没有任何东西是小数点后两位的浮

在下面的代码中,我想生成一个小数点后有两位数字的随机数。例如,我希望随机变量给出(0.26)而不是(0.26463)

这是我的代码:

PROGRAM alaki
IMPLICIT NONE
REAL :: RANDOMREAL
CALL RANDOM_SEED()
CALL RANDOM_NUMBER(RANDOMREAL)
PRINT *, "random number= ", RANDOMREAL

END PROGRAM alaki

在Fortran语言中,没有任何东西是小数点后两位的浮点数。如果需要更改从某个函数获得的值,则必须自己对其进行四舍五入。您可能需要创建一个封装原始函数的函数

舍入可能如下所示:

rounded = real(nint(randomreal * 100)) / 100
这就是你的意思吗

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

您可以注意到,即使在这些计算之后,也不会得到一个完全用右边的零表示的数字,因为十进制数字的机器表示总是一个近似值(这就是为什么我在不知道后续计算逻辑的情况下,看不出你所做的有多大意义)。如果你想要更高的精度,你可以更改实数类型的种类参数。

为什么不将结果四舍五入到小数点后2位?我想使用“randomreal”的结果在另一个函数中。我不想显示结果!这迟早会变成一个关于内部数字表示和格式的讨论。现在还不清楚您真正想要的是什么(如果不是四舍五入)。然后您可能应该解释一下您以后将如何处理该数字(即为什么它必须有两位小数)。@Joshua字符串处理标记没有基本whatshover。请阅读注释。“我想在另一个函数中使用“randomreal”的结果。我不想显示结果!”这是不正确的,因为他试图将数字打印到两位数,而不是为了进一步计算而对数字进行四舍五入。@Joshua WHAT,我读到“我想生成一个小数点后有两位数的随机数”。OP从未说过任何关于印刷的事情,甚至在被要求这样做之后也从未澄清他真正想要什么。而我的答案是被否决的事情?@VladimirF:只有3个可能的答案:1)他迟早需要在小数点后显示一个两位数的数字,2)他需要重做算法以得到一个介于0和100之间的随机整数,或者3)他需要重做算法以使用固定点数。@Joshua你知道他写的我不想显示结果!这是Fortran,随机整数是通过四舍五入从浮点数中计算出来的,Fortran没有任何定点小数,是吗?好吧,我想我应该取消删除我的降票答案,在@Joshua再次出现之前警告你。天哪,这太尴尬了。。。尽管如此,这显然是一个XY问题,我想知道OP想要实现什么。鉴于共享的信息,这是唯一合理的答案。