我需要在dos批处理中进行浮点除法.
我没有办法做到这一点.像这样的东西:
SET /A Res=10/3
Run Code Online (Sandbox Code Playgroud)
返回一个整数.
有可能吗?
我知道这是一个非常古老的话题,但我在之前的所有答案中都找不到简单的Batch方法,所以我在这里发布了一个非常简单易用的纯批处理解决方案.
使用Batch中的定点运算执行操作很简单."固定点"表示您必须提前设置小数位数并在整个操作过程中保留它们.直接执行两个固定点编号之间的加减运算.乘法和除法运算需要一个辅助变量,我们称之为"一",值为1,右边的小数位数("0"位).乘以后,将乘积除以"1"; 在除法之前,将被除数乘以"1".这里是:
@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%!
Run Code Online (Sandbox Code Playgroud)
例如:
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
Run Code Online (Sandbox Code Playgroud)
这样的批处理文件不支持浮点运算.但是,本文提出了一种使用外部脚本文件进行计算的解决方法.脚本文件应使用某种eval函数来计算作为参数传递的表达式并返回结果.这是一个示例VBScript文件(eval.vbs),它执行此操作:
WScript.Echo Eval(WScript.Arguments(0))
Run Code Online (Sandbox Code Playgroud)
您可以从批处理文件中调用此外部脚本,指定要评估的表达式并返回结果.例如:
@echo off
for /f %%n in ('cscript //nologo eval.vbs "10/3"') do (
set res=%%n
)
echo %res%
Run Code Online (Sandbox Code Playgroud)
当然,你会得到一个字符串的结果,但无论如何它总比没有好,你可以将获得的结果作为另一个表达式的一部分传递给eval脚本.