批次中的分数

批次中的分数

为什么下面的代码返回0?

@echo off
set a=100
set /a a=%a%*(50/%a%)

echo %a%
pause

我猜是因为批处理在某个时候将 (50/100) 计算为 0.5,并将其四舍五入为零,因为它在计算 %a%* 之前无法保留小数。我错了吗?我该如何解决这个问题?

答案1

您尝试执行的是使用整数值进行浮点运算。这些将始终被强制转换为整数值。这个问题问的是同一件事:
https://stackoverflow.com/questions/1503888/floating-point-division-in-a-dos-batch
本质上,您无法在批处理脚本中执行浮点运算。您需要使用其他语言/技术才能实现预期结果。

答案2

为什么下面的代码返回0?

批处理文件不支持浮点数学。要解决此限制,您必须使用其他脚本语言。

Powershell 和 VBS 是可能的:


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

限制

批量数学有一个严重的限制:它只能处理 32 位整数。

...

除了使用其他脚本语言外,没有真正的解决方法允许浮点数学。唯一的例外可能是如果你的小数位数有限且固定(例如 2),那么你可以将所有内容乘以 100。要在最终结果中显示小数分隔符,请将整数除以 100,然后是小数分隔符,然后是模数除以 100 连接起来:

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

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

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

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

答案3

如果您在 Windows(而不是 DOS)的命令 shell 中运行,则可以使用 VBScript 为您评估包括浮点数学在内的复杂表达式。

我编写了一个小型辅助库,您可以调用它来执行此操作。

GitHub 上的 EvalBat 库

相关内容