2009-10-01 15 views
9

Potrzebuję wykonać podział zmiennoprzecinkowy w partii wsadowej.Podział zmiennoprzecinkowy w pliku wsadowym

Nie znalazłem sposobu, aby to zrobić. Coś takiego:

SET /A Res=10/3 

zwraca liczbę całkowitą.

Czy można to zrobić?

+0

Dlaczego, na Boga, musisz to zrobić? Czy rozważałeś VBScript lub inny silnik skryptowy? –

+0

Pracowałem nad biblioteką batchum. Wciąż jeszcze bardzo niedokończone. – Joey

+0

Jeśli nadal jesteś zainteresowany zrobieniem tego z czystą partią. https://www.dostips.com/forum/viewtopic.php?t=3854 – Squashman

Odpowiedz

5

Pliki wsadowe jako takie nie obsługują arytmetyki zmiennoprzecinkowej. Jednak this article sugeruje obejście, które wykorzystuje zewnętrzny plik skryptu do wykonywania obliczeń. Plik skryptowy powinien używać jakiejś funkcji eval do oceny wyrażenia przekazanego jako argument i zwrócenia wyniku. Oto przykładowy plik VBScript (eval.vbs), który to robi:

WScript.Echo Eval(WScript.Arguments(0)) 

Można nazwać to zewnętrzny skrypt z pliku wsadowego, należy określić wartości wyrażenia i uzyskać wynik wstecz. Na przykład:

@echo off 
for /f %%n in ('cscript //nologo eval.vbs "10/3"') do (
    set res=%%n 
) 
echo %res% 

Oczywiście, można uzyskać wynik w postaci ciągu znaków, ale lepsze to niż nic i tak, i można przekazać uzyskany wynik do eval skryptu jako część innego wyrazu.

+0

Nie można przekazać wyniku do innego skryptu eval - przynajmniej w ogólnym przypadku. Numery są sformatowane dla bieżących ustawień regionalnych. W moim przypadku oznacza to, że przecinek ',' jest używany jako kropka dziesiętna. Prowadzi to do błędu składni, gdybym ponownie umieścił wynik w skrypcie. – Joey

3

Według this reference, nie ma sensu pływających typu DOS języku wsadowym:

Chociaż zmienne istnieją w języku programowania wsadowego DOS, są bardzo ograniczone. Nie ma typów zmiennych typu integer, wskaźnik ani zmiennoprzecinkowe, tylko łańcuchy.

Myślę, że to, co próbujesz zrobić, nie będzie możliwe bez wdrożenia własnego schematu podziału w celu jednoznacznego obliczenia pozostałej części.

+3

Mimo że są to tylko łańcuchy, możesz wykonać 32-bitową arytmetykę całkowitą ze znakiem 'set/a'. – Joey

2

Niedawno natknąłem się na ten plik wsadowy, aby obliczyć przybliżenie Pi. Jest DivideByInteger etykieta, która może być przydatna: Stupid-Coding-Tricks-A-Batch-of-Pi

Wykorzystuje zestaw MaxQuadIndex zmiennych, z których każda zawiera czterocyfrowy numer (Czteroosobowy), w celu przechowywania cały wynik. Kod umożliwia dzielenie przez liczbę całkowitą od 1 do 10000 włącznie.

:DivideByInteger 
    if defined PiDebug echo.DivideByInteger %1 %2 
    set /a DBI_Carry = 0 
    for /L %%i in (!MaxQuadIndex!, -1, 0) do (
     set /a DBI_Digit = DBI_Carry*10000 + %1_%%i 
     set /a DBI_Carry = DBI_Digit %% %2 
     set /a %1_%%i = DBI_Digit/%2 
    ) 
    goto :EOF 

Print etykieta jest również dostępna ...

2

spróbować

SETLOCAL EnableExtensions EnableDelayedExpansion 
call :calc_ 1 (99-(100*5/100^)^) 
echo !calc_v! 
goto :EOF 
:calc_ 
set scale_=1 
set calc_v= 
for /l %%i in (1,1,%1) do set /a scale_*=10 
set /a "calc_v=!scale_!*%2" 
set /a calc_v1=!calc_v!/!scale_! 
set /a calc_v2=!calc_v!-!calc_v1!*!scale_! 
set calc_v=!calc_v1!.!calc_v2! 
goto :EOF 

wystarczy zmienić

połączenia: calc_ decimalpoint equataion

w przykładzie

decimalpoint jest 1

equataion jest (99- (100 * 5/100 ^) ^), upewnij się, czy używasz(), że zanim włożysz ^), jak w ^)

na zadane wynosi 94,0

jeśli decimalpoint wynosi 2

i equataion jest 22/7; π PI

odpowiedź 3.14

6

Wiem, że jest to bardzo stary temat, ale nie mogę znaleźć prostej metody Batch we wszystkich poprzednich odpowiedziach, dlatego zamieszczam tutaj czyste rozwiązanie Batch, które jest bardzo proste w użyciu.

Wykonuj operacje z użyciem arytmetyki stałoprzecinkowej w pakiecie Batch jest proste. "Ustalony punkt" oznacza, że ​​musisz wcześniej ustawić liczbę miejsc po przecinku i zachować ją przez cały czas operacji. Operacje dodawania i odejmowania między dwoma numerami punktów stałych są wykonywane bezpośrednio. Operacje mnożenia i dzielenia wymagają zmiennej pomocniczej, którą możemy nazwać "jeden", o wartości 1 z właściwą liczbą miejsc po przecinku (jako cyfry "0"). Po pomnożeniu, podziel produkt przez "jeden"; przed dzieleniem pomnóż dywidendę przez "jeden". Oto ona:

@echo off 
setlocal EnableDelayedExpansion 

set decimals=2 

set /A one=1, decimalsP1=decimals+1 
for /L %%i in (1,1,%decimals%) do set "one=!one!0" 

:getNumber 
set /P "numA=Enter a number with %decimals% decimals: " 
if "!numA:~-%decimalsP1%,1!" equ "." goto numOK 
echo The number must have a point and %decimals% decimals 
goto getNumber 

:numOK 
set numB=2.54 

set "fpA=%numA:.=%" 
set "fpB=%numB:.=%" 

set /A add=fpA+fpB, sub=fpA-fpB, mul=fpA*fpB/one, div=fpA*one/fpB 

echo %numA% + %numB% = !add:~0,-%decimals%!.!add:~-%decimals%! 
echo %numA% - %numB% = !sub:~0,-%decimals%!.!sub:~-%decimals%! 
echo %numA% * %numB% = !mul:~0,-%decimals%!.!mul:~-%decimals%! 
echo %numA%/%numB% = !div:~0,-%decimals%!.!div:~-%decimals%! 

Na przykład:

Enter a number with 2 decimals: 3.76 
3.76 + 2.54 = 6.30 
3.76 - 2.54 = 1.22 
3.76 * 2.54 = 9.55 
3.76/2.54 = 1.48 
+0

Bardzo dobrze! Nie wiem, jak to nie jest zaakceptowana odpowiedź, ponieważ jest bardzo prosta; pomnóż liczbę całkowitą przez 10000, aby uzyskać 4 dodatkowe miejsca dziesiętne, i tak dalej. – Gustavo6046

0

Napisałem czysty plik wsadowy konkretnie zrobić podział. Podaje pierwszy wprowadzony numer, a następnie dzieli go na drugi i wyświetla wynik z określoną liczbą dziesiętnych punktów.

Echo off 
cls 
if NOT "%3" == "" (
set n1=%1 
set n2=%2 
set max=%3 
goto :begin 
) 

set counter=2 
set n1=1 
set n2=1 
set ans= 
:start 
Echo. 
Echo. 1/2 
Echo. 
Set /p N1= 1? 
set /p N2= 2? 
Set /p Max= Out how many Decimal Points? 
:begin 
set /a TmpAns=%N1%/%N2% 
set ans=%TmpAns%. 
:: Echo.%ans%.>Answer.txt 
<nul set /p "=%Tmpans%." 
set /a TmpSub=%N2%*%TmpAns% 
set /a N1=%N1%-%TmpSub% 
set N1=%N1%0 
If NOT "%n1%" == "00" (
if %n1% LSS %N2% (
set N1=%N1%0 
set ans=%ans%0 
) 
) else (
Goto :Finished 
) 
set count=0 

:loop 
If "%count%" == "%max%" (
Goto :Finished 
) 

set /a TmpAns=%N1%/%N2% 
set ans=%ans%%TmpAns% 
<nul set /p "=%Tmpans%" 
set /a TmpSub=%N2%*%TmpAns% 
set /a N1=%N1%-%TmpSub% 
set N1=%N1%0 
If NOT "%n1%" == "00" (
if %n1% LSS %N2% (
set N1=%N1%0 
set ans=%ans%0 
) 
) else (
Goto :Finished 
) 
set /a count=%count%+1 
goto :loop 

:finished 
cls 
Echo. 
Echo. 
Echo.The Number 
Echo.%ans% 
Echo. 
Echo. 
set n1=1 
set n2=1 
pause 
goto :eof 

:eof 

Odpowiedź umieszczona w zmiennej% Ans%. Można go również wywołać za pomocą parametrów. ("Divide.bat 50 27 5" dałoby 50/27 z 5 miejsc po przecinku.)

Powiązane problemy