在不损失精度的情况下读取和存储perl中的数字(Perl)

时间:2012-04-23 01:10:53

标签: perl decimal scientific-notation

我在文件中有几个数字,有多种格式:8.3,0.001,9e-18。我正在寻找一种简单的方法来读取它们并存储它们而不会丢失任何精度。在AWK中这很容易,但它在Perl中是如何完成的?我只对使用Perl持开放态度。谢谢!

另外,我想知道是否有一种简单的方法以适当的格式打印它们。例如,8.3应打印为" 8.3"不是" 8.3e0"

2 个答案:

答案 0 :(得分:4)

如果它们是文本字符串,那么将它们作为字符串读入Perl并将它们作为字符串写回来不应该导致任何精度损失。如果你必须对它们进行算术运算,那么我建议安装CPAN模块Math :: BigFloat,以确保不会丢失任何舍入精度。

至于你的第二个问题,Perl不会重新格式化,除非你要求:

$ perl -le 'print 8.3'
8.3

我错过了什么吗?

答案 1 :(得分:1)

来自http://perldoc.perl.org/perlnumber.html

  

Perl可以通过3种不同的方式在内部表示数字:作为本机   整数,作为本机浮点数和十进制字符串。   十进制字符串可能具有指数表示法部分,如   “12.34e-56”。 Native在这里表示“C编译器支持的格式”   用于构建perl“。

这意味着打印数字取决于数字在perl内部的存储方式,这意味着,您必须知道数字在输入时的表示方式。

总的来说,Perl会做正确的事情,但你应该知道使用什么编译器,它如何在内部表示数字,以及如何打印这些数字。例如:

 $ perldoc -f int

 int EXPR

      int  Returns the integer portion of EXPR.  If EXPR is omitted, uses $_.  You should
      not use this function for rounding: one because it truncates towards 0, and two
      because machine representations of floating-point numbers can sometimes produce
      counterintuitive results.  For example, "int(-6.725/0.025)" produces -268 rather than
      the correct -269; that's because it's really more like -268.99999999999994315658
      instead.  Usually, the "sprintf", "printf", or the "POSIX::floor" and
      "POSIX::ceil" functions will serve you better than will int().

我认为如果你想明确地将一个数字作为一个字符串读出来,你最好的选择是使用带有'A *'格式的unpack()。