CMD 设置 /a、模数和负数

CMD set /a, modulus, and negative numbers

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 集 /a 模数运算符的限制吗?

CMD 中的 % 与其他 Microsoft 环境中的非常相似,它是求余函数 - 而不是真正的模运算。对于您的示例,余数在这里准确到 return -6。在 Excel 中使用 mod 是一个真正的模数,它 return 你期望的 1.

虽然它是为 C# 编写的,但下面的文章对差异进行了很好的细分: http://blogs.msdn.com/b/ericlippert/archive/2011/12/05/what-s-the-difference-remainder-vs-modulus.aspx

正如 Jason W 所说,% 不是 modulo 运算符。但是如果你想要 -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

如果你想要真正的模数,你可以使用这个:

set a=-90
set b=7
set /a (a%b+b)%b

我的循环解决方案 - 很高兴结果证明可行,因为这里的所有其他回复都没有给我想要的东西。只需替换 !VARIABEL1/2!用你想计算的。 !模!输出将是计算。 例如。: 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!

干杯, 马丁