2016-07-27 5 views
2

フロートにさまざまな長さのさまざまなソースからいくつかの数値が表示されています。私はすべての数字をそのまま集計しています。数字は自動的に四捨五入されます。誰かがperlで自動四捨五入を防ぐように提案してください。perlで浮動小数点数が丸められるのを防ぐには?

サンプルスニペットは以下のとおりです。

#!/usr/bin/perl 
use strict; 
my $x=200.1564867256545456457; 
my $y=3352.25654454545454; 

print "X : $x\n Y : $y\n"; 
+1

数学::ラウンド[参照](http://search.cpan.org/dist/Math-Round/Round.pm) – ssr1012

答えて

11

数値がfloating pointの有限数であるのに対し、実数は無数にありますが、変更することはできません。

変更を行わずに常に文字列として読み取り、印刷することができます。しかし、あなたが算術演算を実行する瞬間、あなたは浮動小数点の土地にいます。

あなたには2つの選択肢があります。1.数字はprintf/sprintfを使用してデフォルトより多く数字を使用して印刷できます。または2.任意精度の算術演算を使用できます。後者ははるかに遅くなるため、変数の初期化方法を慎重に検討する必要があります。

#!/usr/bin/env perl 

use strict; 
use warnings; 

my %n = (
    x => 200.1564867256545456457, 
    y => 3352.25654454545454, 
); 

printf "%s = %.18f\n", $_, $n{$_} for qw/x y/; 

出力:

x = 200.156486725654531256 
y = 3352.256544545454289619

これは、ほとんどの実数は、浮動小数点数を使って表現することができないという事実を示しています。 Math::BigFloatを使用

#!/usr/bin/env perl 

use strict; 
use warnings; 

use Math::BigFloat; 
Math::BigFloat->accuracy(24); 

my %n = (
    x => Math::BigFloat->new('200.1564867256545456457'), 
    y => Math::BigFloat->new('3352.25654454545454'), 
); 

print "$_ = $n{$_}\n" for qw/x y/; 

出力:

x = 200.156486725654545645700 
y = 3352.25654454545454000000
+0

文字列として '$ x =" 200.1564867256545456457 ";'を格納して印刷します。 – Kusalananda

+0

@ Kusalananda:私が刺すように変えたらどうすればいいですか? – Madhan

+2

また、積分分子と分母を持つ分数として数値を格納するMath :: BigRatもあります。どんなものであれ、あなたのボートを浮かべます。 – ikegami

関連する問題