为何Perl中sprintf无法插值浮点数精度?如何配置小数位数?
问题解决:Perl中动态配置浮点数小数位数
你的代码问题出在格式字符串里的\f——这是Perl的转义字符(代表换页符),不是sprintf的浮点数格式符。sprintf找不到有效的格式说明,就直接输出了格式字符串的前缀%.2。
解决方法有两种:
方法一:修正格式字符串,去掉多余转义
把\f改成f,同时为了变量解析更清晰,可以给变量加花括号:
my $digits = 2; my $test = 5.42223; $test = sprintf("%.${digits}f", $test); print "$test \n";
这样格式字符串会被正确解析为%.2f,sprintf就会按照要求保留2位小数。
方法二:使用sprintf的动态位数参数(更安全)
sprintf支持用*来动态指定小数位数,把位数作为参数传递,避免字符串拼接可能带来的问题:
my $digits = 2; my $test = 5.42223; $test = sprintf("%.*f", $digits, $test); print "$test \n";
这里%.*f中的*会读取下一个参数(也就是$digits的值2)作为小数位数,效果和%.2f完全一样,而且如果$digits是用户输入的内容,这种方式能避免格式字符串注入风险。
两种方法运行后都会输出预期的5.42。
内容的提问来源于stack exchange,提问作者talos
相关产品推荐
相关产品推荐

