You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 06:36:01