如何设置“设置”批处理文件变量中的算术精度?

如何设置“设置”批处理文件变量中的算术精度?

如何设置除法 SET 算术运算的精度?

例如。SET /A t=3/4

但结果是 ' 0' 而不是 ' 0.75' (我想要至少 2 位小数)

或者是否有其他方法可以set /A在批处理文件中执行此类算术运算(使用除“ ”以外的其他方法)?

答案1

如果你使用的是微软的CMD,那么 Nifle 所说的内容适用。但是,如果你使用的是JP Software 的 TCC/LE来取代它,不仅在命令脚本中有了另一种方式进行运算,而且它不仅限于整数运算,计算的精度也是可控的。

当然, TCC/LE 支持/ASET命令的选项。但是,正如文档所述,也可以使用@EVAL[]变量函数

SET T=%@EVAL[3/4]

计算的输出精度%@EVAL[]是一个可控的选项,可以通过三种方式设置:

答案2

SET /A 仅适用于整数。因此无法使用该命令得到 0.75。
而且我不知道在批处理文件中进行算术运算的其他方法。

答案3

您可能无法真正做到您想做的事情,但您可以通过乘以和除以 10 的幂以及进行字符串操作来近似获得所需的结果。例如,考虑以下情况divide.bat

@echo off
set /a q=%1 * 1000 / %2
echo q = %q:~0,-3%.%q:~-3%

%variable_name:~start_pos,length%是命令提示符变量子字符串表示法。负数相对于字符串的长度(变量值);缺失长度表示字符串的其余部分。

以下是一些示例结果:

divide 8 4    ->    q = 2.000
divide 6 4    ->    q = 1.500
divide 3 4    ->    q = .750

在最后一个例子中(你的例如),q实际上是 750。如果你想计算某个数的 75%,

  • 乘以%q%并除以 1000,或
  • 乘以%q%并记住结果是其真实值的 1000×,并且在显示时需要使用子字符串表示法。

答案4

在 Win cmd 中“数字限制为 32 位精度。”即结果必须小于 2147483647(有效数字)。

因此,以下代码执行的算术限制为最多 4 位小数:

(您的操作数设置在第 6 行和第 7 行,表达式/方程式设置在第 48 行,或者放入批处理文件中并提示用户输入算术表达式/运算符和操作数)

[1]REM Note: Win CMD arithmetic limit: 2147483647 (32-bit integers)
[2]REM CMD Error: Invalid number.  Numbers are limited to 32-bits of precision.
[3]REM Max precision is 8 decimals in result ie. 4 decimals per number (multiply)
[4]REM see workarounds: https://www.robvanderwoude.com/battech_math.php
[5]
[6]set num1=-0.22
[7]set num2=0.7
[8]
[9]set p=4
[10]set sign1=&set sign2=&set sign3=
[11]
[12]set tmp=%num1:~0,1%
[13]if %tmp%==- set sign1=-& set num1=%num1:-=%
[14]set tmp=%num2:~0,1%
[15]if %tmp%==- set sign2=-& set num2=%num2:-=%
[16]
[17]set /a tmp=p-1
[18]set nas=1
[19]for /l %i in (1,1,%tmp%) do set /a nas=10*nas >nul
[20]set nas=%nas:~1%
[21]
[22]for %i in (!num1!) do echo %i | find "." >nul && (set tmp=%i) || (set tmp=%i.0)
[23]for %i in (%tmp%) do set tmp=%~xi%nas%& set num1=%~ni!tmp:~1,%p%!
[24]for %i in (!num2!) do echo %i | find "." >nul && (set tmp=%i) || (set tmp=%i.0)
[25]for %i in (%tmp%) do set tmp=%~xi%nas%& set num2=%~ni!tmp:~1,%p%!
[26]
[27]for /l %i in (1,1,%p%) do set tmp=!num1:~0,1!& if !tmp!==0 set num1=!num1:~1!
[28]set nas=1000000000
[29]if %num1% lss %nas% (
[30]set /a num1=num1+nas >nul
[31]set num1=!num1:~1!
[32])
[33]
[34]set nas=1
[35]set ans=1
[36]set sign3=0
[37]
[38]for /l %i in (1,1,8) do (
[39]set tmp=!num1:~0,1!& if !tmp!==0 set num1=!num1:~1!& set /a nas=10*nas >nul & set /a sign3=sign3+1 >nul
[40]set tmp=!num2:~0,1!& if !tmp!==0 set num2=!num2:~1!
[41]set tmp=!num2:~-%i,1!& if !tmp!==0 set /a ans=10*ans >nul& set /a sign3=sign3+1 >nul
[42])
[43]set nas=%nas:~1%
[44]
[45]if %sign1%==- set num1=-%num1%
[46]if %sign2%==- set num2=-%num2%
[47]
[48]set tmp=!num1!/!num2!
[49]
[50]echo %tmp% | find "/" >nul && set tmp=!tmp:%num1%=%num1%%nas%!& set p=%sign3%
[51]echo %tmp% | find "/" >nul && set tmp=!tmp:%num2%=(%num2%/%ans%)!
[52]
[53]echo %tmp% | find "*" >nul && set /a p=p*2 >nul
[54]
[55]set /a ans=%tmp% >nul
[56]
[57]echo %tmp% | find "/" >nul && set nas=1000000000 || set nas=10000
[58]
[59]set tmp=%ans:~0,1%
[60]echo %tmp% | find "-" >nul && set sign3=-& set ans=%ans:-=%
[61]
[62]if %ans% lss %nas% (
[63]set /a ans=ans+nas >nul
[64]set ans=!ans:~1!
[65])
[66]
[67]set ans=!ans:~0,-%p%!.!ans:~-%p%!
[68]if %ans:~0,1%==. set ans=0.%ans:~1%
[69]if %sign3%==- set ans=-%ans%
[70]echo %ans%

在 Win 10 CMD 上测试

相关内容