|
>>2935 68user > あと、キー固定のハッシュ (キーをタイプミスするとエラー扱い)、 > 順番を保持するハッシュ (セットした順に keys が返ってくる) って > 導入されてないんでしたっけ。どこかで聞いた覚えがあるんですが、 > 見つけられない。 みびょーに違う話のような気もしますが、perl-5.005_03 でも $john=[{age=>1, eyes=>2, weight=>3}, 47, "brown", 186]; print "$john->{eyes}\n"; print "$john->[2]\n"; てな書き方ができるんですねぇ。これは知らなかった。 |
|
すいません、今度は Perl 5.005_03 の話です ;;; 経理システムで、 ・単価はドル建てだが、セント未満の端数がありうる (1個につき 0.001 ドルとか) ・個数は「個」だが、1個未満の端数がありうる (0.1 個とか) という条件で、単価x個数=売上を、 小数点以下第3位で切り捨て(小数点以下第2位まで)で求めよ、 という問題で 「100倍して int して100で割る」ということをしていました。 #! perl $tanka = 10000.88; # ドル $kosuu = 1; # 個 $uriage100 = $tanka * $kosuu * 100; # 売上の 100 倍 print "uriage x 100 = $uriage100\n"; $uriage = int($uriage100)/100; print "uriage = $uriage\n"; しかしこうすると、int(1000088) は 10000088 になるので、 uriage x 100 = 1000088 uriage = 10000.87 となります。もっとも手軽な回避方法はなんでしょうか。 もしお分かりでしたらご教示ください。 |
|
cshrcファイルの内容について皆さんにお聞きしたいです。 source .cshrcコマンドを出すときにUnmatchedといわれていますけど、 どこに問題があるかは良く分かりません。 cshrcの内容は以下のようになります************* # .cshrc # User specific aliases and functions # alias rm 'rm -i' alias ls 'ls --color' alias cp 'cp -i' alias mv 'mv -i' #setenv PATH "/usr/sbin:/sbin:$PATH" setenv NCARG_ROOT "/usr/local/ncarg" setenv PATH "/usr/sbin:/bin:$NCARG_ROOT/bin :/home/hongbin/fdgrib1.0/src/pre/fdgrib:/home/hongbin/rams4.3 :/home/hongbin/rams4.3/chq1/plvrams:$PATH" #setenv LD_LIBRARY_PAYH "/usr/FFC/lib" #setenv MANPATH "/usr/FFC/man:$NCARG_ROOT/man" setenv PGI "/usr/pgi" set path = ( $PGI/linux86/bin $path ) if($?MANPATH ==1) then setenv MANPATH $PGI/man:$MANPATH else setenv MANPATH $PHI/man endif #setenv MANPATH "$MANPATH":$PGI/man setenv LM_LICENSE_FILE "$PGI/license.dat" setenv MANPATH "$PGI/man:$NCARG_ROOT/man" set prompt='[%n@%m %c]#' ***************** どこが間違っているでしょうか。 よろしくお願いします。 |
|
>>2937 ふくし sprintfは? |
|
>>2938 初心者 この書き方は出来るのかな??複数行にわたるクオート setenv PATH "/usr/sbin:/bin:$NCARG_ROOT/bin :/home/hongbin/fdgrib1.0/src/pre/fdgrib:/home/hongbin/rams4.3 :/home/hongbin/rams4.3/chq1/plvrams:$PATH" |
|
>>2937 ふくし 勘定系ってやっぱり BCD だったりするんだろうかと思いつつ、 こういうときの常套手段を知らないので、しばし傍観。 >>2938 初心者 csh -fv .cshrc しましょう。あるいは、1行ずつ手でタイプ (あるいはマウスでコピペ) しましょう。どこに問題があるのか わかります。 |
|
>>2940 名無し さん、ありがとうございます。 sprintf は四捨五入なんですね。 ということはあらかじめ 0.005 を引いておけばよい? −−−−−−−−−−プログラム−−−−−−−−−−−−−−>8 #! perl while (<DATA>) { chomp; $tanka = $_; # ドル print "tanka = $tanka "; $tanka -= 0.005; # 切り捨てたいから $kosuu = 1; # 個 $uriage100 = $tanka * $kosuu * 100; # 売上の 100 倍 $uriage = $uriage100 / 100; $uriage = sprintf "%.2f", $uriage; print "uriage = $uriage\n"; } −−−−−−−−−−プログラム終わり−−−−−−−−−−−>8 実行結果。 > keisan tanka = 10000.88 uriage = 10000.88 tanka = 10000.881 uriage = 10000.88 tanka = 10000.882 uriage = 10000.88 tanka = 10000.883 uriage = 10000.88 tanka = 10000.884 uriage = 10000.88 tanka = 10000.885 uriage = 10000.88 tanka = 10000.886 uriage = 10000.88 tanka = 10000.887 uriage = 10000.88 tanka = 10000.888 uriage = 10000.88 tanka = 10000.889 uriage = 10000.88 なんかできてるっぽい、、? __DATA__ 10000.88 10000.881 10000.882 10000.883 10000.884 10000.885 10000.886 10000.887 10000.888 10000.889 |
|
>>2942 ふくし これなんかどうでしょうね。 http://www.harukaze.net/~mishima/perl/faq/newbiefaqpgm.html#5 > $uriage = $uriage100 / 100; 最後に 100 で割るのがなんかおそろしいなぁ。 値によっては循環小数になったりしないのかな。循環小数になっても %.2f してるから OK? |
|
すいません、お騒がせしております ;;; 100 で掛けたり、割ったりしているのは、 int を使いたかったからで、 sprintf を使っている以上、必要ないですね。 (切り捨ての場合) while (<DATA>) { chomp; $tanka = $_; # ドル print "tanka = $tanka "; $tanka -= 0.005; # 切り捨てたいから $kosuu = 1; # 個 $uriage = sprintf "%.2f", $tanka * $kosuu; print "uriage = $uriage\n"; } 四捨五入の場合は 0.005 を引くのをやめるとか。 |
|
だめでした ;;; sprintf "%.2f", $a; に、$a に 10000.005 を渡すと、10000.00 になります。 (環境に依存しまくるかな。FreeBSD 2.2.8_Release、Perl 5.005_03) しょうがないので . で split して、、いろいろしようと思います ;;; ちなみに 68User さん、BCD というのはモジュールありますか? CPAN で検索したら EBCDIC_convert なんとかというのしか 見つかりませんでした ;;; |
|
一人で駄投稿を繰り返して大変申し訳ありません。 けっきょく 100 倍して 0.5 を足して 100 で割る形式に戻し、 変数をすべて Math::BigFloat にしました。 なんとなくできているような気がしますが、 これぐらいの時間帯になってくると 「いったい何ができてるってことなのか」わからなくなってくるので ;;; 明日また考えます。X68000 さん、名無しさん、ありがとうございました。 何かありましたらよろしくお願いします。 |
|
家に帰って思ったけど dc コマンドを `` で囲んでもよかったかも ;;; |
|
>>2947 ふくし もう解決してらっしゃる様ですが、最初のソースの $uriage100 = $tanka * $kosuu * 100; # 売上の 100 倍 を $uriage100 = $tanka * $kosuu * 100 + 0.05; # 売上の 100 倍 みたいにして、端数の発生しない桁(この例なら0.01セントの桁)で 適当な数字を足してやると良いんじゃないでしょうか。 端数の発生しない桁が決められない場合はダメですが・・・。 #ぱっとみて思いついただけなんで全然的外れかもしれません |
|
はじめまして。FreeBSD4.6.2-RELEASEとXFree86 4.2をインストールして、XDMからログインしようとしているのですが、rootではログインできるのですが、一般ユーザだとログインできたと思ってもすぐにもとのログイン画面に戻ってしまいます。.xsessionは作っていないので記述ミスはないと思うのですが、なぜ一般ユーザだとログインできないのか分かりません。どなたか対処法を知っている方がいましたら教えていただきたいのですが。 よろしくお願いします。 |