我在Perl中有一个包含一个小数字的字符串: $ num =“0.00000001”;
当我对它进行数值运算时,它将成为指数格式的数字: $ num = $ num * 100; 打印“$ num \ n”;
结果是:1e-06
问题是, 如何以浮点格式打印此数字,即0.000001。
我知道我可以使用sprintf(“%。6f”,$ num)为特定号码执行此操作, 但我想要一个通用的解决方案, 所以我不必每次都确定小数点后显示多少位数 (如上面的sprintf示例中的6)
答案 0 :(得分:5)
将数值运算应用于$num
时,它将成为浮点数。 1e-06
和0.000001
是该数字的文字表示;存储的值不区分它们。
如果您只是打印或字符串化数字,它会使用默认格式,正如您所见,它会生成"1e-06"
。使用格式为sprintf
的{{1}}会给您一个合理的结果; "%f"
会产生sprintf("%f", $num)
。
但"0.000001"
格式可能会丢失信息。例如:
"%f"
打印:
$num = "0.00000001";
printf("%f\n", $num);
您说要打印而不必每次确定小数点后显示的位数。 某些东西必须做出这样的决定,并且没有普遍正确的方法来做到这一点。显而易见的事情是打印有效数字,省略尾随零,但这会带来一些问题。您为0.000000
打印了多少位数,其十进制表示具有无限序列1.0/3.0
s?并且3
无法在二进制浮点中精确表示:
0.00000001
打印:
$num = "0.00000001";
printf("%f\n", $num);
printf("%.78f\n", $num);
答案 1 :(得分:4)
$ perl -Mbigrat -E'$num = 0.00000001; $num *= 100; say $num'
0.000001