фракция партии до %

#batch-file #variables #math

#пакетный файл #переменные #математика

Вопрос:

Я пытался написать короткий скрипт в пакете, который преобразует две переменные в формате дроби (%a%, числитель и%b%, знаменатель) в процент (%c%)

пакетные переменные поддерживают только целые числа, поэтому я не могу использовать:

 set /A c="%a% / %b% * 100" 
 

Я слышал об обходных путях для этого с помощью сценариев .vbs (экспортируйте%a% и %b% в скрипт, попросите скрипт выполнить математические вычисления и импортировать результат обратно в пакет)

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

Я уверен, что это звучит как вопрос типа «сделай это для меня», но я нигде не могу найти ответ, если есть более простой способ сделать это, пожалуйста, помогите мне.

Комментарии:

1. set /A использует ли 32-разрядную целочисленную арифметику со знаком…

2. @aschipfl хорошо, я знаю об этом, ‘set / A’ не поддерживает использование действительных чисел (десятичных дробей), поэтому выражение, которое я ввел, не будет работать из-за того, что первая операция (/) выдает десятичное число, которое всегда округляется в меньшую сторону, что означает, что если результат операции равен 1, он всегда будет равен 0. таким образом, C может быть только 0 или 100

Ответ №1:

Если вам нужны только целочисленные значения, вы можете изменить порядок выражения

 set /A "c= (a*100) / b"
 

Для немного большей точности вы могли бы использовать

 set /A "c= ( a*100   b/2 ) / b"
 

И если вам нужно несколько знаков после запятой, просто умножьте на большее значение

 set /A "r= (a*10000) / b"
echo %r:~0,-2%.%r:~-2%
 

Ответ №2:

Выполнение математики с десятичными дробями — один из немногих случаев, когда я рекомендую использовать powershell в пакетном скрипте.

 for /f "delims=" %%A in ('powershell %a%/%b%*100') do set "c=%%A"
 

Комментарии:

1. к сожалению, я, возможно, не смогу использовать PowerShell, я пишу этот скрипт на старой машине с воздушным зазором под управлением Windows XP pro (это долгая история), PowerShell не предустановлен до Windows 7.

2. Нет необходимости объяснять; я видел множество приложений в производственных средах, которые были несовместимы с Windows после XP.