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ć?
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ć?
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.
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
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.
Mimo że są to tylko łańcuchy, możesz wykonać 32-bitową arytmetykę całkowitą ze znakiem 'set/a'. – Joey
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 ...
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
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
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
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.)
Dlaczego, na Boga, musisz to zrobić? Czy rozważałeś VBScript lub inny silnik skryptowy? –
Pracowałem nad biblioteką batchum. Wciąż jeszcze bardzo niedokończone. – Joey
Jeśli nadal jesteś zainteresowany zrobieniem tego z czystą partią. https://www.dostips.com/forum/viewtopic.php?t=3854 – Squashman