CMD设置/ a,模数和负数

时间:2015-01-12 01:35:37

标签: 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

那么 - 这是CMD设置/模数运算符的限制吗?

4 个答案:

答案 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!

干杯, 马丁