ページ 11

バッチファイルで小数の四則演算をするには?

Posted: 2009年12月02日(水) 10:18
by 組木紙織
c言語を関係はないのですが、久々の質問です。

現在バッチファイルで色々な処理を扱う状況にあります。
その中でawkやperlのように変数、四則演算、ループを使って便利に扱えればよいと考えています。
変数、ループ、分岐、整数の四則演算についてはバッチファイル内で行う方法があるのですが、
小数の四則演算を取り扱う方法がありません。

整数部2桁、小数部2桁程度の固定小数の和、差の計算だけでかまわないので、何とかする方法は
ないのでしょうか?


環境はWindows2000またはWindowsXPですが、
まずはwindows2000を対象でお願いします。

Re:バッチファイルで小数の四則演算をするには?

Posted: 2009年12月02日(水) 10:28
by Mist
少数二桁ならば全ての値を100倍して計算すればいいんじゃないでしょうか。

Re:バッチファイルで小数の四則演算をするには?

Posted: 2009年12月02日(水) 10:41
by 組木紙織
>Mistさん
回答ありがとうございます。

そのようにして計算できても最後の100で割るときに小数部が切られてしまうのでその方法は使えませんでした。

いい忘れていましたが、最終的にほしい結果は小数部が入った文字列です。

rem Aは12.34の100倍で考えている
set A=1234

rem Bには12.34を入れたいがBは12が入ってしまう
set /A B=A/100

rem ここから先12.34を使っていく

Re:バッチファイルで小数の四則演算をするには?

Posted: 2009年12月02日(水) 10:56
by Mist
rem 計算結果が1234=12.34だったとする
set /a A=1234
set /a B=A/100
set /a C=A%%100

set D=%B%.%C%

文字列でいいならこれでOK(XP動作確認済み)

Re:バッチファイルで小数の四則演算をするには?

Posted: 2009年12月02日(水) 13:41
by pie
> Mistさん

ホントですか?
A=1204とかだとどうなります?

Re:バッチファイルで小数の四則演算をするには?

Posted: 2009年12月02日(水) 14:38
by softya
素直に小数点演算するコンソールアプリを作ったほうが簡単のような・・・。
あるいは、Windows2000だったらWSHが使えるのでWSHで組むとか。

Re:バッチファイルで小数の四則演算をするには?

Posted: 2009年12月02日(水) 15:06
by Mist
set /a A=1209
set /a B=A/100
set /a C=A%%100

if %C% LSS 10 (set D=%B%.0%C%) else (set D=%B%.%C%)

echo %D%

修正しました。
これでも末のゼロ(12.00とか12.10)は残るけど、少数2位までの数値保証と考えればこれでもいいのかな?
変換後の使い道が不明なのでここまでにしておきます。
12.00を12と表現するのであればさらにif文追加してください。


> pieさん

ご指摘ありがとうございました。

Re:バッチファイルで小数の四則演算をするには?

Posted: 2009年12月02日(水) 16:22
by 組木紙織
>皆様
コメント&回答ありがとうございます。

>変換後の使い道が不明なのでここまでにしておきます。
gmt(コマンドラインで地図を描くソフト)を使うためにいちいち同じ値を手で入力すると間違えそうなので
自動化を考えています。


表現については12.00でも12でも問題はありません。


演算&出力はMistさんの方法で出来ると思いますが、ユーザーからの入力値を100倍するという問題が残っています。
引き続いて入力の方法を教えてほしいです。

Re:バッチファイルで小数の四則演算をするには?

Posted: 2009年12月02日(水) 16:35
by Mist
ユーザには小数点付きの状態で入力させたいってことですか?
仕様として、「値は小数点つけずに入力してください。(12.34→1234,12.00→1200)」とするのは駄目ですか?

Re:バッチファイルで小数の四則演算をするには?

Posted: 2009年12月02日(水) 16:45
by 組木紙織
>仕様として、「値は小数点つけずに入力してください。(12.34→1234,12.00→1200)」とするのは駄目ですか?

それは可能です。
(小数入力が無理ならそうしようと思っていました。)

ただ、バッチ処理でどこまでの処理が出来るかどうかが、まだ良くわかっていないので質問をしました。
かなり難しいor不可能なのでしょうか?

Re:バッチファイルで小数の四則演算をするには?

Posted: 2009年12月02日(水) 16:56
by Mist
入力は出来るんですが整数への変換が成功しません。
下のようなバッチ組んでみましたが、小数部分の切り出しで失敗します。
もうちょっと考えてみます。

echo off

set /p INP="値入力(xx.xx形式) >"

echo ret1=%INP%

set /a SEI=%INP:~0,2%
set /a SHOU=%INP:~2,2%

echo SEI=%SEI%
echo SHOU=%SHOU%

set /a A=%SEI%*100+%SHOU%

echo A=%A%

set /a B=A/100
set /a C=A%%100

if %C% LSS 10 (set D=%B%.0%C%) else (set D=%B%.%C%)

echo %D%

echo on

Re:バッチファイルで小数の四則演算をするには?

Posted: 2009年12月02日(水) 17:05
by Mist
改良版。
一応動作する、けど12.03とか入力するとSHOU=03になるので8進数扱いになる。
なので12.09と入力するとSHOU=09になって8進数でありえない数値になってエラーになる。

echo off

set /p INP="値入力(xx.xx形式) >"

echo ret1=%INP%

set /a SEI=%INP:~0,2%
set /a SHOU=%INP:~3,2%

echo SEI=%SEI%
echo SHOU=%SHOU%

set /a A=%SEI%*100+%SHOU%

echo A=%A%

set /a B=A/100
set /a C=A%%100

if %C% LSS 10 (set D=%B%.0%C%) else (set D=%B%.%C%)

echo %D%

echo on

Re:バッチファイルで小数の四則演算をするには?

Posted: 2009年12月02日(水) 17:16
by Mist
無理やり感全開だけど希望通りの動作すると思います。
私がテストした範囲では問題なし、さっきみたいにバグってたらごめんなさい。
ただ、「整数2桁.小数2桁」で入力してもらうしかないです。
8とかは08.00という感じで。

@echo off

set /p INP="値入力(xx.xx形式) >"

echo ret1=%INP%

set /a SEI2=%INP:~0,1%
set /a SEI1=%INP:~1,1%
set /a SHOU1=%INP:~3,1%
set /a SHOU2=%INP:~4,1%

echo SEI2=%SEI2%
echo SEI1=%SEI1%
echo SHOU=%SHOU1%
echo SHOU=%SHOU2%

set /a A=%SEI2%*1000+%SEI1%*100+%SHOU1%*10+%SHOU2%

echo A=%A%

set /a B=A/100
set /a C=A%%100

if %C% LSS 10 (set D=%B%.0%C%) else (set D=%B%.%C%)

echo %D%

@echo on

Re:バッチファイルで小数の四則演算をするには?

Posted: 2009年12月02日(水) 17:18
by Mist
あ、入力データの整合性チェックは入ってません。
間違った入力されるとエラーになるか間違った結果になります。

Re:バッチファイルで小数の四則演算をするには?

Posted: 2009年12月03日(木) 08:34
by 組木紙織
>Mistさん

完成版?ありがとうございます。

まだ作っていませんが、これで作れると思います。

ワイルドカードがあるので文字列処理が比較的得意と思っていましたが
バッチ処理は思ったより出来る機能が少なかった事が収穫です。


ありがとうございました