我的perl代码中有数字行,用于计算2变量
之间的差异$diff = $upper- $lower;
变量upper和lower的值可以是decimal,fractional和exponential。
当我将此差异打印到文件时,我想保留格式,但想要在3位小数后截断小数值。我怎么能这样做?
例如在不同的情况下,
$diff =0.345664; I want to print as 0.346
$diff= 65.9787e-6; I want to print as 65.979e-06.
有人可以帮我怎么做吗?我正在使用%.3f
但很明显它会陷入指数数字。
答案 0 :(得分:1)
试试这个
printf "%.3f\n", $diff;
和
printf "%.3e\n", $diff;
顺便说一下,Perl中只有整数和浮点数值
有
$diff = 0.345664;
printf "%.3f\n", $diff;
$diff = 65.9787e-6;
printf "%.3e\n", $diff;
0.346
6.598e-005
没有一种格式说明符可以根据变量的值提供两种格式 - 您必须编写代码以自行做出决定
也无法使用65.98e-006
格式获取6.598e-005
而不是%e
。小数点前总是有一个非零数字
答案 1 :(得分:1)
尽管有其他答案,但我觉得你想要的只是简单地使用%.3g
,这将保留3个有效数字,但随后丢弃任何尾随的0
。默认情况下,perl格式用于字符串化数字通常为%.15g
。
perl -e'printf "%.3g\n", $_ for 0.345664, 0.349876, 65.9787e-6, 6.59123e-5'
0.346
0.35
6.6e-05
6.59e-05
答案 2 :(得分:-1)
sub format1 { sprintf "%.3f", $_[0] }
say format1(0.345664); # 0.346
sub format2 {
sprintf("%.4e", $_[0])
=~ s/\.(.)/$1./sr
=~ s/([+-]\d\d)\z/ sprintf("%+03d", $1-1) /aer
}
say format2(65.9787e-6); # 65.979e-06