Batch file CMD集合/a、模数和负数

Batch file CMD集合/a、模数和负数,batch-file,cmd,modulo,Batch File,Cmd,Modulo,CMD是否无法使用set/a计算负数模数 90%7在批处理中正确地等于6,但是-90%7给出的是-6而不是1 我认为它可能在评估-(90%7),但情况似乎并非如此,因为(-90)%7也会给出-6 h:\uprof>set /a -90%7 -6 h:\uprof>set /a (-90)%7 -6 那么-这是CMDs set/a模运算符的限制吗?CMD中的%与其他microsoft环境中的情况类似,是一个余数函数,而不是真正的模运算。这里的余数是精确的,返回-6作为示例。在Exce

CMD是否无法使用
set/a
计算负数模数

90%7
在批处理中正确地等于6,但是
-90%7
给出的是-6而不是1

我认为它可能在评估
-(90%7)
,但情况似乎并非如此,因为
(-90)%7
也会给出-6

h:\uprof>set /a -90%7
-6
h:\uprof>set /a (-90)%7
-6

那么-这是CMDs set/a模运算符的限制吗?

CMD中的
%
与其他microsoft环境中的情况类似,是一个余数函数,而不是真正的模运算。这里的余数是精确的,返回-6作为示例。在Excel中使用
mod
是一个真正的模,它确实返回您期望的1

尽管这篇文章是为C#写的,但下面的文章对这一差异进行了详细分析:
正如Jason W所说,
%
不是模运算符。但是如果你想要-b mod N,也许这会有帮助:

@echo off
set /a num1=7
set /a num2=-90
:add
if %num2% LSS 0 set /a num2+=num1&goto add
echo/%num2%
pause

如果需要真模,则可以使用:

设置a=-90
设置b=7
设置/a(a%b+b)%b

我的循环解决方案-很高兴这能奏效,因为这里的所有其他回复都没有给出我想要的。只要更换!1/2!用你想计算的东西。这个模!输出将是计算结果。 例如。: 模式a:10, 模式b:4, 模:2

也许这不是最优雅的方式,但毕竟是批量的D

setlocal enabledelayedexpansion

set mod_a=!VARIABLE1!
set mod_b=!VARIABLE2!
set mod_counter=0
for /l %%k in (1,1,!mod_a!) do (
    set /a mod_counter+=1
    set /a mod_a-=1
    if !mod_counter!==!mod_b! set /a mod_counter=0
    if !mod_a!==0 set modulo=!mod_counter!
)
if not defined modulo set modulo=0
echo modulo is !modulo!
干杯,
Martin

为什么
-90%7
应该给你1而不是-6?根据Google calculator-。Windows calculator也给了我们-6只是为了增加混乱:,谢谢,我找到了另一个表达式,它不需要计算负数的模数-代价是几个字节(例如)。