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