Fortran90舍入问题:如何将五位小数实数保留一位小数
解决Fortran中实数保留一位小数的精度问题
你的问题本质是单精度浮点数的二进制表示限制:十进制的14.2无法用单精度real类型精确存储,计算后得到的14.1999998是它最接近的二进制近似值。下面给你两种实用的解决方案:
方案1:改用双精度实数提升精度
单精度real的精度只有约6-7位有效数字,换成双精度后能大幅减少这类近似误差,计算结果会更接近预期值:
program test_round implicit none double precision :: tempr tempr = nint(14.23456d0 * 10.0d0) / 10.0d0 print*, 'rounded to 1 decimal =', tempr end
运行后输出会接近14.200000000000000,远小于单精度的误差。
方案2:格式化输出强制显示一位小数
如果不需要改变变量存储精度,直接通过输出格式控制,让程序按指定小数位数打印,自动处理近似值的显示:
program test_round implicit none real :: tempr tempr = nint(14.23456 * 10.0) / 10.0 write(*, '(A, F6.1)') 'rounded to 1 decimal =', tempr end
这里F6.1表示总宽度6位、保留1位小数,运行后会直接输出rounded to 1 decimal = 14.2。
另外你提到的floor函数不适合这个场景——它是向下取整而非四舍五入,比如floor(142.3456)会得到142,虽然结果除以10后存储的近似值和nint类似,但逻辑上不符合“四舍五入保留一位小数”的需求,所以nint才是正确的取整函数。
内容的提问来源于stack exchange,提问作者user86927
相关产品推荐
相关产品推荐

