SET命令 - 浮点数?

5

如何在Windows中使用SET命令进行浮点运算。/A代表算术运算,%VAR%打印的是VAR的内容而不是名称。

例如,当我执行以下操作时:

SET /A VAR="2.5+3.1"
ECHO %VAR%
pause

我遇到了“缺少运算符”的错误。 输出值(5.6)也应该转换为浮点数。
我仍在忙于学习基本语法。
谢谢,Snipe
2个回答

7
SET /A 命令的算术运算仅适用于 32 位整数;但是,如果您选择一定数量的小数位并在整个操作中保留它们,则可以使用 SET /A 模拟定点运算。例如:
REM Select two decimal digits for all operations
SET /A VAR=250+310
ECHO RESULT: %VAR:~0,-2%.%VAR:~-2%

这种方法允许您直接执行两个"定点数"的加减法。当然,如果您想以通常的方式输入数字(带有小数点),则必须在执行操作之前消除小数点和左侧零位。
您还可以直接将一个FP(定点数)与整数相乘或相除,结果是正确的。要乘以或除以两个FP数字,我们可以使用一个名为ONE的辅助变量,其具有正确的小数位数。例如:
rem Set "ONE" variable with two decimal places:
SET ONE=100
rem To multiply two FP numbers, divide the result by ONE:
SET /A MUL=A*B/ONE
rem To divide two FP numbers, multiply the first by ONE:
SET /A DIV=A*ONE/B

更多详细信息请参见此帖子


是的,它正在工作。你能解释一下这个 %VAR:~0,-2%.%VAR:~-2% 吗? - METALHEAD
@METALHEAD,基本上是在%VAR%上执行子字符串分割。 %VAR:0,-2%获取整个字符串除了最后两个字符。 然后放置一个点(拼凑而成的小数点)。 然后%VAR:-2%获取字符串的最后两个字符。 因此,“100”将变为“1.00”,或“99999”将变为“999.99”。 - Adam Plocher

5

你不能使用批处理来完成这个任务。它只能处理整数。 但是你可以使用Jscript或者Powershell:

>powershell 5.6+3.1
8.7

针对jscript,您需要创建一个额外的bat文件并调用它(例如jscalc.bat):

 @if (@x)==(@y) @end /***** jscript comment ******
     @echo off

     cscript //E:JScript //nologo "%~f0"  %*
     exit /b 0

 @if (@x)==(@y) @end ******  end comment *********/


 WScript.Echo(eval(WScript.Arguments.Item(0)));

例子:

>jscalc.bat "4.1+4.3"
8.4

请记住,上面的jscript并不十分健壮,不能处理格式不良的表达式。
在两种情况下都需要使用一个封装的FOR /F将结果设置为变量:
>for /f "delims=" %# in ('powershell 5.6+3.1') do set result=%#

>set result=8.7

>for /f "delims=" %# in ('jscalc 5.6+3.1') do set result=%#

>set result=8.7

很可能您已经安装了PowerShell,但它并不是所有机器都可以使用(默认情况下不支持Vista、XP、2003),因此如果您没有安装,您需要使用jscalc.bat

另外,您也可以使用jscript.net(另一个jscript)。创建一个使用这个的.bat文件会更加冗长,并且会创建一个小的.exe文件,但这也是一种选项。以下是jsnetcalc.bat

@if (@X)==(@Y) @end /****** silent jscript comment ******

@echo off
::::::::::::::::::::::::::::::::::::
:::       compile the script    ::::
::::::::::::::::::::::::::::::::::::
setlocal


if exist "%~n0.exe" goto :skip_compilation

:: searching the latest installed .net framework
for /f "tokens=* delims=" %%v in ('dir /b /s /a:d /o:-n "%SystemRoot%\Microsoft.NET\Framework\v*"') do (
    if exist "%%v\jsc.exe" (
        rem :: the javascript.net compiler
        set "jsc=%%~dpsnfxv\jsc.exe"
        goto :break_loop
    )
)
echo jsc.exe not found && exit /b 0
:break_loop



call %jsc% /nologo /out:"%~n0.exe" "%~f0" 
::::::::::::::::::::::::::::::::::::
:::       end of compilation    ::::
::::::::::::::::::::::::::::::::::::
:skip_compilation

::
::::::::::
"%~n0.exe" %*
::::::::
::
endlocal
exit /b 0

****** end of jscript comment ******/

import System;

var arguments:String[] = Environment.GetCommandLineArgs();
Console.WriteLine( eval(arguments[1]) );

例子:

>jsnetcalc.bat 4.5+7.8
12.3

还有一种使用MSHTA的方法(在表达式中设置要计算的表达式):

@echo off
setlocal

:: Define simple macros to support JavaScript within batch
set "beginJS=mshta "javascript:close(new ActiveXObject('Scripting.FileSystemObject').GetStandardStream(1).Write(eval("
set "endJS=)));""

set "expression=8.5+3.5"

:: FOR /F does not need pipe
for /f %%N in (
  '%beginJS% %expression% %endJS%'
) do set result=%%N

echo result=%result%

可以编辑以接受像上面的示例一样的参数...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接