perlで端数を繰り上げて表示するには…
[上に]
[前に]
[次に]
プウ
2000/03/28(火) 09:49:05
初めて書き込みさせて頂きます。
perlプログラム初心者なのですが、例えばランダムなどでで割り出した数値が
4.5など(端数有り)だった場合、その数値を端数切り上げで表示する、
という事は出来るのでしょうか。
申し訳ありませんが、お答えいただけると幸いです。
javaka
2000/03/28(火) 09:59:41
>切り上げ
use POSIX;
$ceil = ceil(4.5); # 5
プウ
2000/03/28(火) 14:01:28
早々のレス、有り難うございます(^^
本当に初心者中の初心者で申し訳ないのですが、use POSIX;とは
なんなのでしょう……。
あと、端数の数値はランダムで出てくるのですが、その場合でも
大丈夫でしょうか?
javaka
2000/03/28(火) 14:41:20
>use POSIX;とはなんなのでしょう……。
モジュールってやつです。perl5からあるみたい...。
ライブラリは requireで
モジュールは use です。
しかし、ライブラリとモジュールの違いがイマイチわかりません。
だれか教えて!
>あと、端数の数値はランダムで出てくるのですが、その場合〜
ご自分でためされましたか〜
私は本に出ていた例を投稿しただけです。(確認はしていません)
コウノトリ
2000/03/28(火) 14:58:09
これでいいでしょう。
--
$a = 4.5;
$b = int($a);
if ($a != $b) { $b++; }
print "[a] = $b\n";
もと。
2000/03/28(火) 15:35:40
$a = 4.5;
print int($a + 0.5);
の方が綺麗かと。
コウノトリ
2000/03/28(火) 15:39:16
>もと。さん
それは繰り上げではなく、四捨五入です。
もと。
2000/03/28(火) 15:45:27
あ、すみません。勘違いでした。
#コウノトリさんが書いたの見れば気付くことでしたね。
Aurai
2000/03/28(火) 16:48:00
$a = 4.5;
print (int($a)+(int($a)!=$a));
print (int($a+.999999999999999));
とか
プウ
2000/03/28(火) 17:57:44
ありがとうございます!
教えて頂いたのを見てプログラムを弄ってみたのですが
$ran1 = int(rand(10));
$ran2 = $ran1 / 2;
にはどう生かせばよろしいのでしょうか…。
よくよく↑を最初に書いておけば、とも思ったのですが勉強ということで
用例を元に頑張ってみようと思ったのですが……駄目でした(;_;)
この$ran2に小数点が出た場合どうすれば繰り上げられるのでしょう…。
H&A
2000/03/28(火) 18:03:28
> $ran2 = $ran1 / 2;
$ran2 = int($ran1 / 2) + $ran1 % 2;
というのはどうでしょう?
H&A
2000/03/28(火) 18:06:58
> $ran2 = int($ran1 / 2) + $ran1 % 2;
$ran2 = int(($ran1 + 1) / 2);
でもオッケーですね。
S-pore
[HomePage]
2000/03/28(火) 18:14:34
ちょっと変わり種で
$ran2 = substr("0112233445", int(rand(10)), 1);
こんなのとか・・・。
"0112233445" をいじればそれぞれの数字になる確率を変えられます。
さだひろ
[E-Mail]
2000/03/28(火) 19:04:01
負の数を考えると
コウノトリさんのもAuraiさんのもだめです.
use POSIX;
@n=(2.5, -1, 0, -3.2, 1.8, -0.1, 3.1415926535);
foreach (@n) {print $_, ' => ', ceil($_), ' : ', &myceil($_), "\n"}
sub myceil{
local $a = $_[0];
local $b = int($a);
$b++ if $a!=$b && $a>0;
return $b;
}
___OUT___
2.5 => 3 : 3
-1 => -1 : -1
0 => 0 : 0
-3.2 => -3 : -3
1.8 => 2 : 2
-0.1 => 0 : 0
3.1415926535 => 4 : 4
さだひろ
2000/03/28(火) 19:34:07
ついでに,切り捨て(floor)はこうです。
use POSIX;
@a=(2.5, -1, 0, -3.2, 1.8, -0.1, 3.1415926535);
foreach (@a) {print $_, ' => ', floor($_), ' : ', &myfloor($_), "\n"}
sub myfloor{
local $a = $_[0];
local $b = int($a);
$b-- if $a!=$b && $a<0;
return $b;
}
___OUT___
2.5 => 2 : 2
-1 => -1 : -1
0 => 0 : 0
-3.2 => -4 : -4
1.8 => 1 : 1
-0.1 => -1 : -1
3.1415926535 => 3 : 3
四捨五入というのはこうかな?
@a=(2.5, -1, 0, -3.2, 1.8, -0.1, 3.1415926535, -2.5);
foreach (@a) {print $_, ' => ', &round($_), "\n"}
sub round{
local $a = $_[0];
return ($a>0 ? int($a+0.5) : int($a-0.5));
}
___OUT___
2.5 => 3
-1 => -1
0 => 0
-3.2 => -3
1.8 => 2
-0.1 => 0
3.1415926535 => 3
-2.5 => -3
プウ
2000/03/28(火) 20:58:26
[[解決]]
なんとかわかりました〜…色々やり方があるんですね、perlってやはり
難しい……でも頑張ってみます!(^^)/
質問に答えてくださった皆々様、本当にありがとうございました!!
レスも早くて、嬉しかったです。
また何かお聞きするかもしれませんが…(^^;)
ではでは。
さだひろ
2000/03/28(火) 22:36:15
>ライブラリとモジュールの違い
ライブラリとはサブルーチンなどを集めて別ファイルとし,
他のperlコードで共通に利用できるようにしたものでしょう.
Utashiro氏のjcode.plやとほほさんのgifcat.plなどが一例です.
例えば,上の四捨五入サブルーチンをライブラリ化するには,
(1) ファイル名abc.plに
package abc;
sub round{
local $a = $_[0];
return ($a>0 ? int($a+0.5) : int($a-0.5));
}
1;
と書けば,同じディレクトリ内の.plから,
require 'abc.pl';
&abc'round(2.5);
のように呼び出すことが出来ます.
モジュールというのはライブラリの1種で,
拡張子.pm(perl module)をもちます.
ファイルの最初にBEGINブロックを宣言する必要があります.
例えば,モジュールを作るなら,ファイル名をabc.pmとして
(package名のABCとファイル名が同じであることに注意),
BEGIN{
package ABC;
require Exporter;
@ISA = qw(Exporter);
@EXPORT = qw(round);
@EXPORT_OK = qw();
}
sub round{
local $a = $_[0];
return ($a>0 ? int($a+0.5) : int($a-0.5));
}
1;
と書けば,四捨五入のサブルーチンを,
use ABC;
print round(2.5), "\n";
で呼び出すことができます.
詳しいことは説明できませんが,青ラクダを見るとこんな感じです.
[上に]
[前に]
[次に]