如何正确使用formatC处理算术运算结果的数字格式化?
问题原因及解决办法
核心问题:浮点数精度误差 + 整数格式的截断规则
- 浮点数精度限制:
100*0.29的实际计算结果并不是精确的29。由于二进制浮点数无法精确表示部分十进制小数,这个运算的真实值是接近28.999999999999996的数值,你可以用以下代码查看完整值:print(100*0.29, digits = 20) #> [1] 28.999999999999996 - formatC的整数格式规则:当指定
format = "d"时,formatC会直接截断小数部分(而非四舍五入),把28.999...转换为整数28,再按照width=3和flag="0"补零,最终得到"028"。
解决办法
如果需要得到预期的"029",可以先对运算结果做四舍五入处理,再传入formatC:
formatC(round(100*0.29), width = 3, format = "d", flag = "0") #> [1] "029"
或者使用sprintf函数,它的整数格式化会自动处理四舍五入:
sprintf("%03d", 100*0.29) #> [1] "029"
内容的提问来源于stack exchange,提问作者mafiale
相关产品推荐
相关产品推荐

