nowologix
Goto Top

Batch - Dividieren ? (mit kommastelle)

z.B.
-> CMD: set /a 120/13 = 9
-> RRECHNER: 120/13 = 9,2

Hey
ich würde gerne wissen ob es möglich ist mit der CMD
mit kommastellen zu dividieren...

Ich brauche dies für eine prozent rechnung:

X/100*X

nur ohne kommastellen oder ohne genaue ausgabe der rechnung
ist das kaum präzise durchzuführen...


hat jemand eine lösung ?
(unter umständen auch mit VBS)

:- )

Vielen dank für die eventuelle Mühe


Nowo

Content-Key: 81254

Url: https://administrator.de/contentid/81254

Printed on: April 16, 2024 at 07:04 o'clock

Member: bastla
bastla Feb 20, 2008 at 21:38:57 (UTC)
Goto Top
Hallo Nowologix!

(unter umständen auch mit VBS)
Na dann: face-wink
@echo off & setlocal
set Zahl1=120
set Zahl2=13
set Stellen=2

set R=%temp%\Rechne.vbs
echo Set a=WScript.Arguments:WScript.Echo FormatNumber(Eval(a(0)),a(1))>%R%
for /f %%i in ('cscript //nologo %R% "%Zahl1%/%Zahl2%" %Stellen%') do set Ergebnis=%%i  
echo %Ergebnis%
Zwischen den Anführungszeichen kannst Du im Prinzip jede gültige Berechnung (auch, wie gezeigt, mit Variablen) angeben.

Grüße
bastla
Member: Biber
Biber Feb 20, 2008 at 21:48:28 (UTC)
Goto Top
Moin Nowologix,

nein, es lässt sich nicht am CMD-Prompt/im Batch mit Nachkommastellen rechnen.

Das Ergebnis allerdings, wenn Du es nur irgendwohin schreiben willst, kannst Du natürlich erzeugen.

Es steht dir ja frei, statt 120/13 [soll herauskommen: 9,2] zu rechnen.
>set /a 1200/13
92
-oder-
>set /a 12000/13
923
...dann hast Du die "richtigen" Zahlenwerte, aber (noch) kein Komma dazwischen.

Wenn es gar nicht anders geht, dann:
:: BatschDivide.cmd 
@echo off & setlocal enabledelayedexpansion
REM Para1 zu teilende Zahl
REM Para2 Divisor
REM Para3 Anzahl Nachkommastellen
If [%3]== (echo Syntax %0: AuffemStrich UntermStrich NK) & goto :eof
Set "xNullen=000000000"  
Set /a x=1!xNullen:~-%3!

set /a ProzMalX=%1 * x /%2
set /a ProzVK=ProzMalX / x
set /a ProzNK=ProzMalX %% x
Echo %1 / %2 = %prozVK%,%prozNK% [Genauigkeit %3 Nachkommastellen]
In Aktion:
>e:\test\BatschDivide.cmd 120 13 3
120 / 13 = 9,230 [Genauigkeit 3 Nachkommastellen]

(=22:37:05  D:\temp=)
>e:\test\BatschDivide.cmd 121 13 3
121 / 13 = 9,307 [Genauigkeit 3 Nachkommastellen]

>e:\test\BatschDivide.cmd 121 13 2
121 / 13 = 9,30 [Genauigkeit 2 Nachkommastellen]

[is' aber alles Unsinn eigentlich.... Rechnen mit Nachkommastellen is'nich im Batch.]

Grüße
Biber

[Edit] P.S. @bastla: FOR-Anweisungen kann ich auch... face-wink
>for /f "tokens=5" %i in ('e:\test\BatschDivide.cmd 121 13 2') do @echo Ergebnis: %i  
Ergebnis: 9,30
[/Edit]
Member: Biber
Biber Feb 20, 2008 at 22:06:35 (UTC)
Goto Top
Nachtrag.
bastlas Parameterübergabe (mit 2 Parametern) ist in der Tat etwas weniger holprig.

Also dann:
:: BatschDivide.cmd 
@echo off & setlocal enabledelayedexpansion
REM Para1 Quotient zweier ganzzahlen zB 130/12
REM Para2 Anzahl Nachkommastellen
If [%2]== (echo Syntax %0: Quotient NK) & goto :eof
Set "xNullen=000000000"  
Set /a x=1!xNullen:~-%2!

set /a ProzMalX=x*%1
set /a ProzVK=ProzMalX / x
set /a ProzNK=ProzMalX %% x
Echo %1 = %prozVK%,%prozNK% [Genauigkeit %2 Nachkommastellen]
Demo:
>e:\test\BatschDivide.cmd 121/13 2
121/13 = 9,30 [Genauigkeit 2 Nachkommastellen]

>e:\test\BatschDivide.cmd 121/13 3
121/13 = 9,307 [Genauigkeit 3 Nachkommastellen]

>e:\test\BatschDivide.cmd 121/13 4
121/13 = 9,3076 [Genauigkeit 4 Nachkommastellen]

Grüße
Biber
Member: miniversum
miniversum Feb 21, 2008 at 12:45:02 (UTC)
Goto Top
Warum nicht einfach so:
set /a vk=120/13
set /a nk=120%13
echo vk,nk
Member: Biber
Biber Feb 21, 2008 at 18:36:31 (UTC)
Goto Top
Moin miniversum,
Warum nicht einfach so:
Hmmm .... weil es nicht stimmt? Weil es doch sowieso im Batch nicht geht? face-wink
Probiere es mit den Werten 101/25 oder 100/34 ...

Aber gut, auch ich hatte in meinem Schnipsel noch einen Fehler drin:
:: BatschDivide.cmd v03
@echo off & setlocal enabledelayedexpansion
REM Para1 Quotient zweier ganzzahlen zB 130/12
REM Para2 Anzahl Nachkommastellen
If [%2]== (echo Syntax %0: Quotient NK) & goto :eof
Set "xNullen=000000000"  
Set /a x=1!xNullen:~-%2!

set /a ProzMalX=x*%1
set /a ProzVK=ProzMalX / x
REM ## BUG in V02 set /a ProzNK=ProzMalX %% x        ###fixed in next line
set ProzNK=!ProzMalX:~-%2!
Echo %1 = %prozVK%,%prozNK% [Genauigkeit %2 Nachkommastellen]

Problem. wenn die erste(n) Nachkommastellen mit "0" beginnen, wird diese "0" einfach weggeworfen.

Beispiel:
>e:\test\BatschDivide_V2.cmd 101/25 2
101/25 = 4,4 [Genauigkeit 2 Nachkommastellen]
#### hier im alten code "4,4" statt "4,04" ### 
>e:\test\BatschDivide.cmd 101/25 2
101/25 = 4,04 [Genauigkeit 2 Nachkommastellen]
## bereinigter Schnipsel.

Aber, wie mehrfach geschrieben, es geht doch gar nicht im Batch.

Das nächste Problem wäre, dass ja auch nicht gerundet werden würde, sondern abgeschnitten.

Von daher gilt (wie bei Datumsberechnungen) entweder VBS o.ä. nehmen oder genau wissen, wo die Batch-Minen liegen.

Grüße
Biber
Member: Biber
Biber Mar 03, 2008 at 05:48:59 (UTC)
Goto Top
Moin Nowologix,

liest Du noch mit? Gib doch bitte mal Feedback.

Danke
Biber
Member: Nowologix
Nowologix Mar 03, 2008 at 14:07:48 (UTC)
Goto Top
ja ^^
also die division funktioniert ja wunderbar...
aber die prozentrechnung...

mh... ich überdenk das ganze nochmal

gibt es keine prozentuale rechenmethode in VBS ?

ich weis vorhin gabs schon eine lösung... die aber hat nicht wirklich treffsichere ergebnisse gebracht
Member: bastla
bastla Mar 03, 2008 at 14:21:08 (UTC)
Goto Top
Hallo Nowologix!

Kannst Du etwas genauer darstellen, wo das Problem liegt?

gibt es keine prozentuale rechenmethode in VBS ?
Was meinst Du damit?

Grüße
bastla
Member: Nowologix
Nowologix Mar 03, 2008 at 22:06:34 (UTC)
Goto Top
naja ich dachte sowas wie:

"dividiere %zahl1% / %zahl2% schreibe ergebniss in datei" > calc.vbs
start calc.vbs
lese datei aus


das man quasi auf VBS ausweicht und das ganze parallel zum programm rechnen lässt...
Member: bastla
bastla Mar 03, 2008 at 22:14:04 (UTC)
Goto Top
Hallo Nowologix!

Damit hast Du recht gut zusammengefasst, was mein im allerersten Kommentar oben geposteter Ansatz so macht (außer, dass die "calc.vbs" bei mir "Rechne.vbs" heißt face-wink) ...

Grüße
bastla
Member: Biber
Biber Mar 04, 2008 at 07:02:08 (UTC)
Goto Top
Moin Nowologix,

auch ich bekomme hier langsam große Kinderaugen.... kannst Du bitte Deine (jetzige) Frage oder Deine Gedankengänge noch mal neu formulieren?
Ich kann momentan das Problem nicht so richtig greifen...

Grüße
Biber
Member: Nowologix
Nowologix Mar 04, 2008 at 14:03:00 (UTC)
Goto Top
Ok also

Ich will: ^^

set /a answer=%zahl1% / 100 * %zahl2%

Der Dreisatz ist nicht das problem... genausowenig wie die multiplikation.
Aber mir scheint es so als würde der CMD zum rechnen nur ein Integer und kein Real oder anderes
zur verfügung stehen. Bei rechnungen wie 101 / 3 kommt eben nicht 33,66, sondern auschließlich "33" heraus. Würde man der CMD einen buffer zuweisen der eine Gleitkommazahl zulässt wärde das ganze problem gelöst...

naja da das anscheinend nicht möglich ist, habe ich überlegt das ganze mit einem visual basic script z berechnen.

Will heißen die rechnung wird eine eine VBS datei ausgegeben, ausgerechnet und wider zurück gegeben.
Eben als z.B. 33,66
nur scheint es komplikationen mit den kommata zu geben bzw. mit der kommasetzung


PS: Vielen dank für die mühe =) tut mir leid das ich in letzter zeit sehr kurz angebunden bin, daher wenig zeit zum antworten finde
Member: miniversum
miniversum Mar 04, 2008 at 14:34:31 (UTC)
Goto Top
Mach ein Punkt statt komma.
"," -> "."
Member: Biber
Biber Mar 04, 2008 at 14:48:43 (UTC)
Goto Top
hmmm, Nowologix,

aber verstanden habe ich jetzt noch nicht ganz, wieso dann mein Schnipsel nicht ausreicht..
(=15:48:48  D:\temp=)
>e:\test\BatschDivide.cmd 101/3 2
101/3 = 33,66 [Genauigkeit 2 Nachkommastellen]

Grüße
Biber
Member: bastla
bastla Mar 04, 2008 at 16:14:33 (UTC)
Goto Top
... und
@echo off & setlocal
set Zahl1=101
set Zahl2=3
set Stellen=2

set R=%temp%\Rechne.vbs
echo Set a=WScript.Arguments:WScript.Echo FormatNumber(Eval(a(0)),a(1))>%R%
for /f %%i in ('cscript //nologo %R% "%Zahl1%/%Zahl2%" %Stellen%') do set Ergebnis=%%i  
echo %Ergebnis%
liefert bei mir ein (korrekt gerundetes) Ergebnis von "33,67".

Um auch noch das von miniversum angesprochene Problem "Komma vs Punkt" (das allerdings in Nowologix Beispielen noch kein Kriterium war) zu entschärfen, noch folgende Variante:
@echo off & setlocal
set Zahl1=101,3
set Zahl2=3
set Stellen=2

set R=%temp%\Rechne.vbs
echo Set a=WScript.Arguments:WScript.Echo FormatNumber(Eval(Replace(a(0),",",".")),a(1))>%R%  
for /f %%i in ('cscript //nologo %R% "%Zahl1%/%Zahl2%" %Stellen%') do set Ergebnis=%%i  
echo %Ergebnis%

Grüße
bastla
Member: shcshc
shcshc Jun 15, 2011 at 08:25:30 (UTC)
Goto Top
Hallo bastla,

wie müsste man das vbs-script abändern, damit als Ergebnis 1068 statt 1.068 erscheint?


Herzlichen Dank,
SHC
Member: bastla
bastla Jun 15, 2011 at 10:44:43 (UTC)
Goto Top
Hallo shcshc!

Verwende folgende Zeile 7:
echo Set a=WScript.Arguments:WScript.Echo FormatNumber(Eval(Replace(a(0),",",".")),a(1),,,0)>%R%
Grüße
bastla
Member: shcshc
shcshc Jun 15, 2011 at 17:19:48 (UTC)
Goto Top
Hallo bastla,

Vielen Dank für die schnelle Antwort!!

SHC
Member: mycroftone
mycroftone Dec 15, 2011 at 17:33:11 (UTC)
Goto Top
Hallo Biber

Deine Batchdatei funktioniert glaub ich immer noch nicht richtig.

Wenn ich die mit

e:\test\BatschDivide_V3.cmd 23/1223 6

Aufrufe kommt als Ergebniss 0,18806 heraus.

Das richtig Ergebniss ist aber 0,018806 weißt du wo da der Hacken liegt ?
Member: bastla
bastla Dec 15, 2011 at 18:32:09 (UTC)
Goto Top
Hallo mycroftone!

Füge vor Zeile 12 noch ein:
set "ProzMalX=%xNullen%%ProzMalX%"
Grüße
bastla

P.S.: Nicht, dass ich darauf herumhacken face-wink möchte, aber
wo da der Hacken liegt ?
hätte ich mit einem Zeichen (und ich meine nicht das Leerzeichen vor "?") weniger geschrieben ...
Member: mycroftone
mycroftone Dec 15, 2011 at 19:36:14 (UTC)
Goto Top
Hallo Bastla

Ja das Problem ist gelößt.

MIt
:: BatschDivide.cmd v03
@echo off & setlocal enabledelayedexpansion
REM Para1 Quotient zweier ganzzahlen zB 130/12
REM Para2 Anzahl Nachkommastellen
If [%2]== (echo Syntax %0: Quotient NK) & goto :eof

Set "xNullen=000000000"  
Set /a x=1!xNullen:~-%2!

set /a ProzMalX=x*%1
set /a ProzVK=ProzMalX / x

set "ProzMalX=%xNullen%%ProzMalX%"  
set ProzNK=!ProzMalX:~-%2!

Echo %1 = %prozVK%,%prozNK% [Genauigkeit %2 Nachkommastellen]


Ergibt
>e:\test\BatschDivide_V3.cmd 23/1223 6
23/1223 = 0,018806 [Genauigkeit 6 Nachkommastellen]

Auch
>e:\test\BatschDivide_V3.cmd  2224/1223 6
2224/1223 = -1,693350 [Genauigkeit 6 Nachkommastellen]
Bring das richtig Ergebnis

Aber
>e:\test\BatschDivide_V3.cmd  22123/1223 6
22123/1223 = 0,529978 [Genauigkeit 6 Nachkommastellen]
Bringt 0,529978 aus und nicht 18,089125

Also sehr selltsam.
Member: bastla
bastla Dec 15, 2011 at 19:54:29 (UTC)
Goto Top
Hallo mycroftone!

Hatte Biber weiter oben erwähnt, dass das Ganze in Batch eigentlich nicht geht? face-wink

Da der Zahlenbereich für arithmetische Operationen nur von -2147483648 bis 2147483647 reicht, sind auch der Hilfkonstruktion "multiplizieren wir zwischendurch eben mal kurz mit 1000000" Grenzen gesetzt (für 4 Nachkommastellen ginge es sich noch aus) ...

Grüße
bastla
Member: mycroftone
mycroftone Dec 15, 2011 at 20:20:31 (UTC)
Goto Top
Hallo Bastel

Danke

So was ähnliches habe ich mir schon gedacht.

>e:\test\BatschDivide_V3.cmd   22123/1223 4
22123/1223 = 18,0891 [Genauigkeit 4 Nachkommastellen]

funktioniert.

Schönen abend noch.
Member: Biber
Biber Dec 15, 2011 at 20:24:55 (UTC)
Goto Top
Moin mycroftone,

ergänzend zu bastla nur noch ein weiteres Indiz für das "geht eigentlich gar nicht mit Batch"

C:\Temp>set /a 2212300/1223
1808
C:\Temp>set /a 22123000/1223
18089
C:\Temp>set /a 221230000/1223
180891
C:\Temp>set /a 2212300000/1223
-1702916
-> diese ganze Set /a-Arie ist insgesamt so etwas von buggy hingewurschtelt, dass ich sie wirklich nur zum Hochzählen meines running gag counters rgc verwende.
Und auch das nur, solange der Wert so klein bleibt, dass er dem korreliert, was sich die Redmonder PraktikantInnen mit ihrer begrenzten Phantasie so vorstellen konnten.

Nimm diesen "Befehlszeileninterpreter" cmd.exe nur so ernst, wie er es verdient.
Ist ein kleines Tool für das Nötigste - aber ich glaube nicht daran, dass Heerscharen von hochbezahlten EntwicklerInnen da seit Jahrzehnten an einer Version 12.0 Premium Delüx rumfeilen.

In B- und C-Movies ist es oft so, dass du mit einer abgelaufenen PayBack-Karte in Sekundenbruchteilen eine Haustür auch ohne Schlüssel öffnen kannst.
Das kann klappen, muss aber nicht.

Im Normalfall nehmen die meisten in solchen Situationen statt einer abgelaufenen PayBack-Karte eine gültige Kreditkarte und rufen einen Schlüsselnotdienst.

Weil die Erfolgsaussichten mit dem richtigen Werkzeug spürbar höher sind.

Grüße
Biber
Member: Markus303
Markus303 Jun 25, 2015 at 17:30:42 (UTC)
Goto Top
Hi Leute.
Ich bin jetzt nicht gerade der grösste Computerspezialist, aber ich glaube ich habe eine einfache Methode gefunden wie man Zahlen mit Kommastellen Dividieren kann:

z.B. 15/4=3 das gäbe dann die erste Variable= Zahl1
Dann könnt ihr für die erste Kommastelle 15*10=150 Das könnt ihr dann durch die Zahl teilen also 150/4=37
Jetzt könnt ihr 37%10 Dann kommt ihr auf 7 das ist dann die Zweite Variable= Zahl2
dann könnt ihr echo %Zahl1%.%Zahl2%

falls ihr noch die dritte Kommastelle wollt müsst ihr einfach 15*100=1500/4=375%100 =5 =Zahl3

USW..

ich versuche das jetzt noch als CMD programm zu schreiben aber wahrscheinlich ist es dann nicht ganz richtig. Wie gesagt bin noch so gut bin ja auch erst 14 XD
Member: timlg07
timlg07 Oct 19, 2016 at 17:03:34 (UTC)
Goto Top
Diese Frage ist zwar schon "ziemlich" alt, aber falls jemand so etwas in der Art wissen möchte ist es vllt nicht schlecht ;)
Habe in den tiefen meiner Festplatte noch ein Programm gefunden:

@echo off
title dividieren
echo DIVIDIEREN:
:BEG
set /p "ui=Aufgabe: "  
:BEGFALSE
set /p "ch=[R]est/[D]ezimal "  
if %ch%==r goto :Rest
if %ch%==d goto :Dezi
echo error
goto BEGFALSE

:Rest
for /f "tokens=1,2 delims=/" %%a in ("%ui%") do set a=%%a & set b=%%b  
set /a los=a/b
set /a los2=a-(los*b)
echo %los% rest %los2%
pause >nul
goto BEG

:Dezi
for /f "tokens=1,2 delims=/" %%a in ("%ui%") do set a=%%a & set b=%%b  
set /a los=a/b
set /a los2=a-(los*b)
set /a losx=los2
set    erg=%los%,
set /a count=0
:LOOP
set /a count+=1
if %count%==100 echo schon %count% dezimalstellen berechnet. Fortfahren? [j]/[n] & set /p "ui="  
if %count%==200 echo schon %count% dezimalstellen berechnet. Fortfahren? [j]/[n] & set /p "ui="  
if %count%==500 echo schon %count% dezimalstellen berechnet. Fortfahren? [j]/[n] & set /p "ui="  
if %count%==1000 echo schon %count% dezimalstellen berechnet. Fortfahren? [j]/[n] & set /p "ui="  
if %count%==5000 echo schon %count% dezimalstellen berechnet. Fortfahren? [j]/[n] & set /p "ui="  
if %count%==10000 echo schon %count% dezimalstellen berechnet. Fortfahren? [j]/[n] & set /p "ui="  
if %ui%==n goto ERG 
set /a losxx=(losx*10)/b
set /a losxxx=(losx*10)-(losxx*b)
if %losxxx%==0 goto :ERG
set /a losx=losxxx
set erg=%erg%%losxx%
goto :LOOP
:ERG
echo %erg%
pause >nul
echo.
goto :BEG

Hatte zwar erst keine Ahnung was ich da mal zusammengeschraubt hatte, aber habs hier mal einfacher formuliert:

@echo off
set /p "ui=Aufgabe: "  
::mithilfe von for den Nenner vom Zähler trennen;
for /f "tokens=1,2 delims=/" %%a in ("%ui%") do set a=%%a & set b=%%b  
::den ganzzahligen Wert ausrechnen;
set /a los=a/b
::Rest ermitteln;
set /a losx=a-(los*b)
set    erg=%los%,
set /a count=0
:LOOP
set /a count+=1
::folgendes dient zur Abfrage wie viele dezimalstellen ermittelt werden sollen;
if %count%==100 echo schon %count% dezimalstellen berechnet. Fortfahren? [j]/[n] & set /p "ui="  
if %count%==200 echo schon %count% dezimalstellen berechnet. Fortfahren? [j]/[n] & set /p "ui="  
if %count%==500 echo schon %count% dezimalstellen berechnet. Fortfahren? [j]/[n] & set /p "ui="  
if %count%==1000 echo schon %count% dezimalstellen berechnet. Fortfahren? [j]/[n] & set /p "ui="  
if %count%==5000 echo schon %count% dezimalstellen berechnet. Fortfahren? [j]/[n] & set /p "ui="  
if %count%==10000 echo schon %count% dezimalstellen berechnet. & goto ERG
if %ui%==n goto ERG

::Vorgehen wie beim schriftlichen dividieren;
set /a losxx=(losx*10)/b
set /a losxxx=(losx*10)-(losxx*b)
if %losxxx%==0 goto :ERG
set /a losx=losxxx
::kommastelle wird zum ergebnis hinzugefügt;
set erg=%erg%%losxx%
goto :LOOP

:ERG
echo %erg%
pause >nul