-2

私は現在、バッチ スクリプトでゲームに取り組んでおり、ある場所で小数の乗算を行う必要があります。問題は、最終結果が常に 0 になることです。

これはコードです:

@echo off 
echo Calcultating New Values
echo ...
ping localhost -n 2 >nul
set /p coal_price_buy_brt=<coal_price_buy_brt.wss
set /p coal_ind_buy=<coal_ind_buy.wss
cls
echo First Values :
echo ################################
echo ## Coal Price Brutto  ##  %coal_price_buy_brt%  ##
echo ################################
echo ## Coal Index Buy ## %coal_ind_buy% ##
echo ################################
ping localhost -n 3 >nul
echo %coal_price_buy_brt%
echo %coal_ind_buy%
set ENABLEDELAYEDEXPANSION=coal_price_buy_net
set /p coal_price_buy_net=<calc %coal_price_buy_brt%*%coal_ind_buy%
echo Complete Table :
echo ################################
echo ## Coal Price Brutto  ##  %coal_price_buy_brt%  ##
echo ################################
echo ## Coal Index Buy ## %coal_ind_buy% ##
echo ################################
echo ## Coal Price Netto ## %coal_price_buy_net% ##
echo ################################

ファイルデータは次のとおりです。

coal_price_buy_brt = 150
coal_ind_buy = 0.84

編集:この投稿から4年後、私は現在IT研究に取り組んでおり、コーディングでは整数と浮動小数点数に違いがあることに気づきました...当時助けてくれてありがとう!

4

5 に答える 5

2

これは古い質問であることは知っていますが、同様の質問で独自のスクリプトを作成しました。おそらく、私の答えは、同じ/類似の質問を持つ誰かを助けることができます. 私自身の質問は、「バッチ スクリプトで浮動小数点数を使用するにはどうすればよいですか?」というものでした。StackOverflow に関する他の個人的な質問について熟考し、調査した結果、次のサンプル スクリプトを思いつきました。浮動小数点数を、スクリプトの残りの部分で使用できる 2 つの変数の形式の分数にほとんど変換します。同様の質問に対するこの回答https://stackoverflow.com/a/20531384/2464491と併せて使用できます。

@echo off
setlocal EnableExtensions
setlocal EnableDelayedExpansion

REM This is how I do a block comment.
goto SOF
========Begin Comment========
Title:  deciTest.bat

This batch script checks to see if the number inputed is an interger or a floating point number.
If it is a floating point number, it determines to how many decimal places up to 4096 places.
It then informes the user of how to use the floating point number in arithmatic equations.
Of course, if you include within your script, you can simply call upon the !intOut! and
!multiplier! variables elswhere in your script.
=========End Comment=========


:SOF

REM Check to see if the user supplied a number.
if "%1"=="" (
    REM If not, tell them how to use the file.
    echo Usage: deciTest.bat [number]
    echo.
    echo [number]   The number to check.  Enter either an integer
    echo            or a floating point number.
    echo.
    goto eof
)

REM Assign the user input to variable decNum
set decNum=%1

REM Plop the number into a file
echo !decNum!>decNum.tmp

REM Check to see if there is a decimal point
findstr /c:"." decNum.tmp >null

REM If it is found, the number is a floating point number
REM So lets make it so we can use it.
if %errorlevel%==0 (
    REM Separate our Characteristic (before the .) and Mantissa (after the .)
    for /f "tokens=1-18* delims=." %%a in (decNum.tmp) do (
        REM Count the length of our Mantissa (How may decimal places?)
        set "s=%%b"
        set "s=!s!#"
        set "decPlaces=0"
        for %%P in (4096 2048 1024 512 128 64 32 16 8 4 2 1) do (
            if "!s:~%%P,1!" NEQ "" (
                set /a "decPlaces+=%%P"
                set "s=!S:~%%P!"
            )
        )
        REM Inform the user of our findings.
        echo %%a.%%b is a floating point number with !decPlaces! decimal places
        call :Integrate
        echo.
        REM Create the variable !intOUt! for use elswhere in the code
        set /a intOut=%%a*!multiple!+%%b
        REM Tell the user how to use this particular floating number
        echo Your batch file can use !intOut! in your arithmatic equations.
        echo Simply divide your result by !multiple!.
    )
) else (
    REM If it aint floatin', it's an integer
    echo %1 is an integer
)

goto eof

:Integrate  REM Create the !multiple! variable to be used elsewhere in the script
set count=!decPlaces!
set multiple=1

:startloop
    set /a multiple*=10
    set /a count-=1
    if not !count!==0 goto startloop

:eof

このコードは、浮動小数点数の処理方法を示しています。基本的に、浮動小数点数を分数に変換します (!intOut!/!multipler!)。算数を少し調整すると。!intOut! で乗算し、!intOut!/!multiplier! を送信します。ただし、ここにあるサンプルスクリプトに必要な小数点以下の桁数は多くあります: https://stackoverflow.com/a/20531384/2464491

これが、バッチ スクリプトで浮動小数点数を操作しようとしたときに同じ問題に遭遇した人に役立つことを願っています。確かに、そのような数値で動作するようには設計されていませんが、いつでも問題を回避する方法をスクリプト化できます。

于 2015-12-03T11:44:56.377 に答える
2

SET /A コマンドの算術演算は、整数のみを扱うことができます。小数点のキーを持たない電卓があると想像してください。150*0.84 という演算をどのように達成できますか? 2 番目の値が常に 1 未満で小数点以下 2 桁であることがわかっている場合は、代わりに 150*84 を実行して、結果の 2 桁目の前 (右から左) に小数点を挿入できます。

@echo off
set coal_price_buy_brt=150
set coal_ind_buy=0.84

rem Convert coal_ind_buy to integer
set coal_ind_buy=%coal_ind_buy:0.=%

rem Execute the multiplication
set /A result=coal_price_buy_brt*coal_ind_buy

echo Result as integer: %result%
echo Result as fixed point with two decimals: %result:~0,-2%.%result:~-2%

値に整数部分が含まれている可能性がある場合は、整数値への適切な変換を実行し、乗算を実行して、適切な場所に小数点を挿入できます。ただし、値を浮動小数点 (指数が 10 の場合) に変換し、すべての適切な変換を行う場合を除き、常に固定の小数点以下桁数 (「固定小数点演算」) を選択する必要があります。

Batch での固定小数点演算の詳細については、http: //www.dostips.com/forum/viewtopic.php? f=3&t=2704&p=12523#p12523 を参照してください。

于 2013-07-18T19:16:44.200 に答える
1

この回答で説明されているように、ハイブリッド Batch-JScript ファイルを使用できます: DOS バッチ ファイルで対数を計算する方法を探しています。

このメソッドを使用すると、対数、平方根など、あらゆる浮動小数点演算を評価できます。

@if (@CodeSection == @Batch) @then
@echo off

rem Evaluate floating point expressions via JScript, for example:
call :Expr result=%coal_price_buy_brt%*%coal_ind_buy%
echo %result%
goto :EOF

:Expr result=expression
for /F "delims=" %%a in ('Cscript //nologo //E:JScript "%~F0" "%2"') do set "%1=%%a"
exit /B

@end
WScript.Echo(eval(WScript.Arguments.Unnamed.Item(0)));

利用可能な JScript 数学演算の詳細については、http: //msdn.microsoft.com/en-us/library/ie/b272f386 (v=vs.94).aspx を参照してください。

于 2013-07-19T06:48:33.393 に答える
1

バッチ演算は INTEGER であるため、0.84 は 0 または無効な数値として解釈されます。

于 2013-07-18T15:44:25.257 に答える
1

このバッチ ファイルを呼び出して、数学的な評価を行うことができます。

vbs.bat という名前を付けてから使用するcall vbs 150*0.84と、結果は変数という名前になります%val%

@echo off
>"%temp%\VBS.vbs" echo Set fso = CreateObject("Scripting.FileSystemObject") : Wscript.echo (%*)
for /f "delims=" %%a in ('cscript /nologo "%temp%\VBS.vbs"') do set "val=%%a"
del "%temp%\VBS.vbs"
于 2013-07-18T23:28:21.190 に答える