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
那么 - 这是CMD设置/模数运算符的限制吗?
答案 0 :(得分:5)
如果你想要真正的模数,你可以使用它:
set a=-90
set b=7
set /a (a%b+b)%b
答案 1 :(得分:4)
CMD中的%
与其他微软环境非常相似,是一个余数函数 - 不是真正的模运算。其余部分在此处准确,为您的示例返回-6。在Excel中使用mod
是一个真正的模数,它会返回您预期的1。
虽然它是为C#编写的,但下面的文章对差异有很大的细分: http://blogs.msdn.com/b/ericlippert/archive/2011/12/05/what-s-the-difference-remainder-vs-modulus.aspx
答案 2 :(得分:2)
正如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
答案 3 :(得分:0)
我的带有循环的解决方案-很高兴这可以正常工作,因为这里的所有其他答复都没有给我我想要的东西。只需更换!VARIABEL1 / 2!与您要计算的内容。 !modulo!输出将用于计算。 例如。: mod_a:10, mod_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!
干杯, 马丁