当天真地在bash中使用mod命令时,残差会在负分子中得到错误的符号(在我看来):
如果我写:
for i in {-5..5}; do echo $(( $i % 3 )) ; done
Run Code Online (Sandbox Code Playgroud)
我得到输出(作为一行)
-2 -1 0 -2 -1 0 1 2 0 1 2
Run Code Online (Sandbox Code Playgroud)
我如何实现"正确"的行为
1 2 0 1 2 0 1 2 0 1 2
Run Code Online (Sandbox Code Playgroud)
不要循环直到结果为正或启动 perl 或 python,请考虑以下内容:
for i in {-5..5}; do echo $(( (($i % 3) + 3) % 3)) ; done
这将产生 OP 所需的输出。
这是可行的,因为第一个模将把结果带入 -3 到 3 的范围内,加 3 会使结果在 0 到 6 的范围内,然后我们可以再次执行模(加 3 对此没有影响)。
一般来说:mod = ((a % b) + b) % b