在DOS批处理文件中执行以下操作时,在第3行获取“缺少运算符”错误 - 因此第二个变量最终为零 - 为什么会这样?
SET VAR1=0.3
ECHO %VAR1%
SET /A VAR2=2*%VAR1%
ECHO %VAR2%
答案 0 :(得分:2)
那是因为set /a
只能处理整数。它是点,它会破坏你的语法。
作为解决方法,您可以使用(使用“大”数字):
SET VAR1=3/10
ECHO %VAR1%
SET /A VAR2=200*%VAR1%
ECHO %VAR2%
set /a VAR2=200*3/10
注意:由于set /a
仅按整数计算,2*0.3
= 2*3/10
= 0.6
仅为您提供0
(不进行舍入,只需切割)
答案 1 :(得分:1)
如果您想在BAT中使用浮点数,可以使用混合脚本BAT / VBS,BAT / JS或BAT / PS。
这是一个带有BAT / VBS代码的示例:
@echo off
::Creating the Math VBS file
if not exist "Math.vbs" echo Wscript.echo replace(eval(WScript.Arguments(0)),",",".")>Math.vbs
SET VAR1=0.3
::Calling the Math VBS
call:Math 2 * %var1%
echo Result : %Result%
::Calling the Math VBS
Call:Math Cos(2000*%Result%)
echo Result : %Result%
exit/b
:Math
echo Working : "%*"
for /f %%a in ('cscript /nologo Math.vbs "%*"') do set "Result=%%a"
输出
工作:“2 * 0.3”
结果:0.6
工作:“Cos(2000 * 0.6)”
结果:0.996095822518803
如您所见,您也可以使用VBS的标准数学函数(Cos,Sin,Hex,Rnd,Int,Fix,Log,Oct,SGn,Sqr,Abs)。
答案 2 :(得分:1)
将非整数数乘以10的幂,比如100,并用整数计算。如果你最终在var x中说314,你最终会这样做:
echo %x:~0,-2%.%x:~-2%
你得到3.14
答案 3 :(得分:1)
@SachaDee提供的智能解决方案的替代方案是使用PowerShell,它允许通过命令行传递代码。
PowerShell的其他数学函数的语法有点冗长,但它确实具有不需要创建临时文件的优点。在不利方面,调用VBScript可能至少要慢一些。
@SETLOCAL
@ECHO OFF
CALL :EVAL RESULT1 "1.5 * 3.1415926"
@ECHO Result: %RESULT1%
CALL :EVAL COS_60deg "[Math]::Cos(3.1415926/3)"
@ECHO Result: %COS_60deg%
CALL :EVAL RESULT1 "[Math]::Pow(.25,3)"
@ECHO Result: %RESULT1%
EXIT /B
:EVAL
FOR /F %%r IN ('PowerShell -NoProfile -Command "%~2" ^<NUL') DO (SET "%~1=%%~r")
EXIT /B
最好的实际解决方案可能是在CMD / batch(我的偏好)中根本不执行此操作,或者以10的幂(也是解决方案)缩放十进制值,以便您始终执行整数运算,然后&#34;规模&#34;它回来了(使用子串操作)。