以下代码行在我当前的项目上运行:
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
=6
和6/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 位的限制。
一般来说,对于浮点数学,我建议使用其他脚本语言。
算术表达式 (SET /a)
对于简单的算术来说,将表达式放在“引号”中是可选的,但对于使用逻辑运算符的任何表达式来说,这都是必需的。
任何返回小数结果的 SET /A 计算都将向下舍入为最接近的整数。
来源放
进一步阅读
- Windows CMD 命令行的 AZ 索引- 与 Windows cmd 行相关的所有事物的绝佳参考。
- 放- 显示、设置或删除 CMD 环境变量。使用 SET 所做的更改将仅在当前 CMD 会话期间保留。