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";

で呼び出すことができます.

詳しいことは説明できませんが,青ラクダを見るとこんな感じです.

[上に] [前に] [次に]