Деление плавающей запятой в пакетном файле

Мне нужно сделать разделение с плавающей запятой в пакете dos.

Я не нашел способ сделать это. Что-то вроде этого :

SET /A Res=10/3 

возвращает целое число.

Можно ли это сделать?

Пакетные файлы как таковые не поддерживают арифметику с плавающей запятой. Однако в этой статье предлагается обходной путь, который использует внешний файл сценария для выполнения вычислений. Файл сценария должен использовать некоторую функцию eval для оценки выражения, переданного в качестве аргумента, и возврата результата. Вот пример файла VBScript ( eval.vbs ), который делает следующее:

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

Вы можете вызвать этот внешний скрипт из своего пакетного файла, указать выражение, которое будет оцениваться, и вернуть результат. Например:

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

Конечно, вы получите результат как строку, но в любом случае это лучше, чем ничего, и вы можете передать полученный результат сценарию eval как часть другого выражения.

Я знаю, что это очень старая тема, но я не могу найти простой пакетный метод во всех предыдущих ответах, поэтому я размещаю здесь чистое пакетное решение, которое очень просто в использовании.

Выполнение операций с использованием арифметики с фиксированной точкой в ​​пакете является простым. «Фиксированная точка» означает, что вы должны заранее установить количество десятичных знаков и сохранить их во время операций. Выполнение операций сложения и вычитания между двумя номерами фиксированной точки выполняется напрямую. Для операций умножения и деления требуется вспомогательная переменная, которую мы можем назвать «одним», со значением 1 с правильным числом десятичных знаков (как цифры «0»). После умножения разделите произведение на «один»; перед делением умножьте дивиденд на «один». Вот:

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

Например:

 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 

Согласно этой ссылке , в языке DOS нет типа с плавающей запятой:

Хотя на языке программирования DOS существуют переменные, они крайне ограничены. Не существует целочисленных, указательных или переменных переменных с плавающей запятой, только строк.

Я думаю, что то, что вы пытаетесь сделать, будет невозможно без реализации вашей собственной схемы деления для вычисления остатка явно.

Недавно я встретил этот командный файл, чтобы вычислить приближение Pi. Существует ярлык DivideByInteger который может быть вам полезен: Stupid-Coding-Tricks-A-Batch-of-Pi

Он использует набор переменных MaxQuadIndex , каждый из которых содержит четырехзначное число (четверка), чтобы сохранить весь результат. Код позволяет делить на целое число от 1 до 10000 включительно.

 :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

попробуй это

 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 

просто измените

call: calc_ decimalpoint equataion

в примере

десятичная точка равна 1

equataion (99- (100 * 5/100 ^) ^), убедитесь, что вы используете (), который вы вставляете ^ до), как в ^)

ответ – 94,0

если десятичная точка равна 2

и equataion – 22/7; π pi

ответ 3.14

Я написал чистый пакетный файл специально для разделения. Он берет первый введенный вами номер, а затем делит его на второй и отображает результат с таким количеством десятичных точек, которое вы указываете.

 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  

Ответ помещается в переменную% Ans%. Его также можно вызывать с параметрами. («Divide.bat 50 27 5» даст вам 50/27 из 5 десятичных знаков.)

  • Отображение вывода командной строки Windows и redirect ее в файл
  • Что означает :: (двойной двоеточие) в пакетных файлах DOS?
  • Удалить определенные строки в txt-файле через пакетный файл
  • Как вы работаете в пакетном файле Windows?
  • (Пакет Windows) Goto внутри, если блок ведет себя очень странно
  • Задайте вывод команды как переменной (с помощью труб)
  • Почему задержка с расширением заканчивается, когда внутри блока кода?
  • Сравнение пакетных файлов переменной с константой
  • Команда Batch для обнаружения всех возможных проблем с ping
  • Выполнить с параметрами
  • В чем причина того, что путь пакетного файла, на который ссылается% ~ dp0, иногда изменяется при смене каталога?
  • Давайте будем гением компьютера.