CMD设置/ a,模数和负数

问题描述 投票:6回答:4

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

batch-file cmd modulo
4个回答
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


5
投票

如果你想要真正的模数,那么你可以使用它:

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

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

0
投票

我的解决方案有一个循环 - 非常高兴这结果起作用,因为这里的所有其他回复都没有给我我想要的东西。只需更换!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!

干杯,马丁

© www.soinside.com 2019 - 2024. All rights reserved.