批处理操作返回“除以零错误”,其中延迟扩展开启且操作有效

批处理操作返回“除以零错误”,其中延迟扩展开启且操作有效

以下代码行在我当前的项目上运行:

set /a "hp = hp - ((atk*arandom)/((edef*6)/edefbonus))"

当您用变量的值替换它们时,结果如下所示:

set /a "hp = 50 - ((2*2)/((1*6)/8))"

这个问题的答案是 44.666667,应该四舍五入为 45。但是,当代码运行时,Batch 只会告诉我“除以零错误”,无论是使用变量的版本还是使用数字的版本。

我真的找不到线索了。我检查了括号是否不均匀,检查了未设置的变量,并且 EnabledDelayedExpansion 已设置。那么我做错了什么……?

答案1

除非有理由用分母除以 edfbonus 而不是用分子乘以它,否则你可以通过重新排列计算来避免零除数问题:

set /a "hp = hp - ((atk*arandom*edefbonus)/(edef*6))"

外括号和引号是不必要的,并且 set /a 有一个运算符,可以节省一些输入并整理表达式,如下所示:

set /a hp -= atk*arandom*edefbonus/(edef*6)

既然你提到了四舍五入,我就补充一点:

假设上述运算符右边的值-=始终为正数,则进行舍入的最简单方法是:

set /a hp -= (10*atk*arandom*edefbonus/(edef*6)+5)/10

请注意,我们在除法之前乘以 10,而不是除法之后,因此计算如下:

10*2*2*8 =320
1*6      =6
320/6    =53
53+5     =58
58/10    =5

如果我们在除法后乘以 10,例如

set /a hp -= (atk*arandom*edefbonus/(edef*6)*10+5)/10

计算如下:

2*2*8 =32
1*6   =6
32/6  =5   (we just lost the fraction digit, so rounding won't work)
5*10  =50
50+5  =55
55/10 =5

结果相同,但只是因为无论如何四舍五入都会向下舍入。

答案2

批处理不能处理浮点数,只能处理整数。

因此((1*6)/8)=0而不是0.75。然后您尝试除以(2*2)0结果出现“除以零”错误。

建议的解决方案?改用 PowerShell:

PS Y:\> $hp = 50 - ((2*2)/((1*6)/8))
PS Y:\> $hp
44.6666666666667

相关 SU 问题:

相关问题:

答案3

批量操作返回“除以零错误”

set /a "hp = 50 - ((2*2)/((1*6)/8))"

这是因为1*6=66/8= 0.75

和:

任何返回小数结果的 SET /A 计算都将向下舍入为最接近的整数。

因此0.75四舍五入为0

6/0返回“除以零错误”。


解决方法

除了使用其他脚本语言外,没有其他真正的解决方法可以实现浮点数学。

唯一的例外可能是,如果小数位数有限且固定(例如 2),那么您可以将所有内容乘以 100。

要在最终结果中显示小数分隔符,请将除以 100 的整数、小数分隔符和除以 100 的模数连接起来:

SET Whole = Result / 100
SET "Fraction = Result %% 100"
SET Result=%Whole%.%Fraction%

但这可能会破坏 32 位的限制。

一般来说,对于浮点数学,我建议使用其他脚本语言。

来源NT 批处理文件中的数学运算


算术表达式 (SET /a)

对于简单的算术来说,将表达式放在“引号”中是可选的,但对于使用逻辑运算符的任何表达式来说,这都是必需的。

任何返回小数结果的 SET /A 计算都将向下舍入为最接近的整数。

来源


进一步阅读

  • Windows CMD 命令行的 AZ 索引- 与 Windows cmd 行相关的所有事物的绝佳参考。
  • - 显示、设置或删除 CMD 环境变量。使用 SET 所做的更改将仅在当前 CMD 会话期间保留。

相关内容