SET命令 - 浮点数?

3 windows floating-point var batch-file set

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

例如,当我这样做时:

SET /A VAR="2.5+3.1"
ECHO %VAR%
pause
Run Code Online (Sandbox Code Playgroud)

我收到错误:'Missing Operator'.输出(5.6)也应该转换为浮点数

我还在忙着学习基本语法.

问候,狙击

npo*_*aka 5

你不能用批处理来做到这一点。它只适用于整数。但您可以使用 Jscript 或 powershell:

>powershell 5.6+3.1
8.7
Run Code Online (Sandbox Code Playgroud)

对于 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)));
Run Code Online (Sandbox Code Playgroud)

例子:

>jscalc.bat "4.1+4.3"
8.4
Run Code Online (Sandbox Code Playgroud)

请记住,上面的 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
Run Code Online (Sandbox Code Playgroud)

您很可能已经安装了 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]) );
Run Code Online (Sandbox Code Playgroud)

例子:

>jsnetcalc.bat 4.5+7.8
12.3
Run Code Online (Sandbox Code Playgroud)

甚至还有一种使用 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%
Run Code Online (Sandbox Code Playgroud)

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


Aac*_*ini 5

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%
Run Code Online (Sandbox Code Playgroud)

此方法允许您直接执行两个"固定点"数字的加或减.当然,如果要以通常的方式输入数字(带小数点),则必须在执行操作之前消除小数点并保留零.

您也可以直接将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
Run Code Online (Sandbox Code Playgroud)

这篇文章的进一步细节.