如何检测值附近的数字?我有以下代码,但我想缩短它。
SET /A "AI_1=%AI%-2"
SET /A "AI_2=%AI%-1"
SET /A "AI_1h=%AI%+1"
SET /A "AI_2h=%AI%+2"
IF %Speed% EQU %AI_2% GOTO :ACCELERATE
IF %Speed% EQU %AI_1% GOTO :ACCELERATE
IF %Speed% EQU %AI% GOTO :ACCELERATE
IF %Speed% EQU %AI_1H% GOTO :ACCELERATE
IF %Speed% EQU %AI_2H% GOTO :ACCELERATE
答案 0 :(得分:3)
也许有点神秘,但这缩短了代码
2>nul set /a "1/((speed-ai-1)*(speed-ai)*(speed-ai+1))" || goto :ACCELERATE
它只是试图计算一个分裂。如果speed
值在[AI-1 .. AI+1]
范围内,则除数中至少有一个元素为0
,因此乘法将为0
,并且除法将失败, 除以零错误。条件运算符||
(如果前一个命令失败,则运行下一个命令)将处理这种情况。
如果speed
和ai
的值很高(批处理算术只处理整数有符号的32位值),那么操作应分成三个不同的分区以避免乘法中的溢出
2>nul set /a "1/(speed-ai-1), 1/(speed-ai), 1/(speed-ai+1)" || goto :ACCELERATE
答案 1 :(得分:1)
EQU : Equal
NEQ : Not equal
LSS : Less than <
LEQ : Less than or Equal <=
GTR : Greater than >
GEQ : Greater than or equal >=
如果您的数字接近当前数字,我会将LEQ和GEQ结合起来推迟。
答案 2 :(得分:1)
这个for
循环遍历AI-3
到AI+3
,并对它们之间的每个整数进行if
比较。
SET /A "AI_3Lower=%AI%-3"
SET /A "AI_3Higher=%AI%+3"
for /l %%G in (%AI_3Lower,1,%AI_3Higher) do (
if %Speed% EQU %%G goto :accelerate
)
答案 3 :(得分:1)
使用您已经解雇的想法:
Set/A "Upper=AI+2,Lower=AI-2"
If %Speed% GEq %Lower% If %Speed% LEq %Upper% GoTo ACCELERATE