Divisão de ponto flutuante em um arquivo de lote

Eu preciso fazer uma divisão de ponto flutuante em um dos lotes.

Eu não encontrei uma maneira de fazer isso. Algo assim :

SET /A Res=10/3 

retorna um número inteiro.

É possível fazê-lo ?

Arquivos em lote, como tal, não suportam a aritmética de ponto flutuante. No entanto, este artigo sugere uma solução alternativa que usa um arquivo de script externo para fazer cálculos. O arquivo de script deve usar algum tipo de function eval para avaliar a expressão passada como um argumento e retornar o resultado. Aqui está um exemplo de arquivo VBScript ( eval.vbs ) que faz isso:

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

Você pode chamar esse script externo de seu arquivo em lote, especificar a expressão a ser avaliada e recuperar o resultado. Por exemplo:

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

Naturalmente, você obterá o resultado como uma string, mas é melhor que nada, e você pode passar o resultado obtido para o script eval como parte de outra expressão.

Eu sei que este é um tópico muito antigo, mas não consigo encontrar um método Batch simples em todas as respostas anteriores, então eu posto aqui uma solução Batch pura que é muito simples de usar.

Executar operações usando aritmética de ponto fixo em Lote é simples. “Ponto fixo” significa que você deve definir um número de decimais com antecedência e mantê-lo durante as operações. Operações de adição e subtração entre dois números de ponto fixo são executadas diretamente. As operações de multiplicação e divisão requerem uma variável auxiliar, que podemos chamar de “um”, com o valor de 1 com o número correto de decimais (como dígitos “0”). Depois de multiplicar, divida o produto por “um”; antes da divisão, multiplique o dividendo por “um”. Aqui está:

 @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%! 

Por exemplo:

 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 

De acordo com essa referência , não há nenhum tipo de ponto flutuante na linguagem de lote do DOS:

Embora existam variables ​​na linguagem de programação em lote do DOS, elas são extremamente limitadas. Não existem tipos de variables ​​inteiros, de ponteiro ou de ponto flutuante, apenas strings.

Eu acho que o que você está tentando fazer será impossível sem implementar seu próprio esquema de divisão para calcular o resto explicitamente.

Recentemente, deparei com esse arquivo em lote para calcular uma aproximação de Pi. Há um label DivideByInteger que pode ser útil para você: Stupid-Coding-Tricks-A-Batch-of-Pi

Ele usa um conjunto de variables MaxQuadIndex , cada uma contendo um número de quatro dígitos (quádruplo), para armazenar todo o resultado. O código permite a divisão por um inteiro entre 1 e 10000, inclusive.

 :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 

Um label de Print também está disponível …

tente isso

 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 

Apenas mude

chamada: calc_ decimalpoint equataion

no exemplo

decimalpoint é 1

equataion é (99- (100 * 5/100 ^) ^); certifique-se de usar () que você insere ^ antes) como em ^)

a resposta é 94,0

se decimalpoint é 2

e equataion é 22/7; π pi

a resposta é 3,14

Eu escrevi um arquivo de lote puro especificamente para fazer a divisão. Ele pega o primeiro número typescript e divide-o pelo segundo e exibe o resultado com o número de pontos decimais que você especificar.

 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  

A resposta colocada na variável% Ans%. Também pode ser chamado com parâmetros. ("Divide.bat 50 27 5" daria a você 50/27 de 5 pontos decimais.)