2017-02-20 18 views
0

如何檢測接近某個值的數字?我有以下代碼,但我想縮短它。批處理 - 如果變量值大約是一個數字

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 

回答

3

也許有點神祕,但是這縮短了代碼

2>nul set /a "1/((speed-ai-1)*(speed-ai)*(speed-ai+1))" || goto :ACCELERATE 

它只是試圖計算一個部門。如果speed的值在範圍[AI-1 .. AI+1]中,除數中至少有一個元素將爲0,則乘法將爲0,並且除法將以除以零誤差而失敗。條件運算符||(如果前一個失敗,則運行下一個命令)將處理這種情況。

如果speedai的值高(批次算術只處理整數簽署32位值),則操作應該被分成三個不同的部門,以避免溢出在乘法

2>nul set /a "1/(speed-ai-1), 1/(speed-ai), 1/(speed-ai+1)" || goto :ACCELERATE 
1
EQU : Equal 
NEQ : Not equal 
LSS : Less than < 
LEQ : Less than or Equal <= 
GTR : Greater than > 
GEQ : Greater than or equal >= 

我將結合LEQ和GEQ,如果你有一些接近目前的一個defermine。

源:https://ss64.com/nt/if.html

+0

不錯的主意!然而正如我所說的代碼應該比較2個變量。變量的值可能會改變,所以我認爲LEQ和GEQ在這種情況下並不是非常有用..... – SteveFest

+1

您可以隨時檢查它何時發生變化。 – NizonRox

+0

沒錯。但它會需要更多的代碼..... – SteveFest

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 
) 
+1

正在尋找一個解決方案,這樣的事情是我會爲你嘗試,但似乎你明白了。不錯:) – NizonRox

1

使用你已經開除的想法:

Set/A "Upper=AI+2,Lower=AI-2" 
If %Speed% GEq %Lower% If %Speed% LEq %Upper% GoTo ACCELERATE 
+0

好主意。但%AI%變量需要增加2. – SteveFest

+2

我創建了代碼,它可以完成代碼縮短的代碼。我只能根據我面前的信息提供回覆。根據你最新的評論,我編輯了我的帖子。 – Compo