2012-04-23 5 views
2

ファイルには8.3、0.001、9e-18のようないくつかの数字があります。私はそれらを読み込み、精度を損なうことなく保存する簡単な方法を探しています。これはAWKでは簡単ですが、Perlではどのように行われますか?私はPerlを使うことしかできません。ありがとう!percision(Perl)を失うことなくperlに数値を読み込んで格納する

また、適切な形式で簡単に印刷する方法があるかどうかは疑問でした。たとえば、8.3は "8.3e0"ではなく "8.3"として出力されます

答えて

4

テキスト文字列の場合は、文字列としてPerlに読み込んで文字列として出力しても、精度が失われてはなりません。算術演算を行う必要がある場合は、CPANモジュールMath :: BigFloatをインストールして、丸め精度を失わないようにしてください。あなたはそれを聞いていない限り

あなたの2番目の質問については、Perlは任意の再フォーマットを行いません。

$ perl -le 'print 8.3' 
8.3 

私は何かが足りないのですか? http://perldoc.perl.org/perlnumber.htmlから

1

はPerlが内部的に3種類の方法で数字を表現することができます:ネイティブ 整数として、ネイティブ浮動小数点数として、および小数点文字列として。 小数の文字列は、 "12.34e-56"のように、指数表記の部分を持つことがあります。ここでのネイティブとは、「perlを構築するために使用されたCコンパイラ でサポートされている形式」を意味します。

これは、数値を出力する方法が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 *」形式で()アンパックを用いることであろうと思います。

関連する問題