代码之家  ›  专栏  ›  技术社区  ›  Jérôme

批处理文件中的浮点除法

  •  12
  • Jérôme  · 技术社区  · 16 年前

    SET /A Res=10/3
    

    返回一个整数。

    6 回复  |  直到 8 年前
        1
  •  6
  •   Helen    16 年前

    批处理文件本身不支持浮点运算。然而, this article eval 函数计算作为参数传递的表达式并返回结果。下面是一个示例VBScript文件( eval.vbs )这就是:

    WScript.Echo Eval(WScript.Arguments(0))
    

    您可以从批处理文件中调用此外部脚本,指定要计算的表达式并返回结果。例如:

    @echo off
    for /f %%n in ('cscript //nologo eval.vbs "10/3"') do (
      set res=%%n
    )
    echo %res%
    

        2
  •  9
  •   Aacini    11 年前

    我知道这是一个非常古老的话题,但我在之前的所有答案中都找不到简单的批处理方法,所以我在这里发布了一个简单易用的纯批处理解决方案。

    在批处理中使用定点算法执行操作很简单。”“定点”意味着您必须提前设置小数位数,并在整个操作过程中保持小数位数。直接执行两个定点数字之间的加法和减法运算。乘法和除法运算需要一个辅助变量,我们可以称之为“1”,其值为1,小数位数正确(如“0”位)。相乘后,将乘积除以“一”;除法前,将股息乘以“一”。这是:

    @echo off
    setlocal EnableDelayedExpansion
    
    set decimals=2
    
    set /A one=1, decimalsP1=decimals+1
    for /L %%i in (1,1,%decimals%) do set "one=!one!0"
    
    :getNumber
    set /P "numA=Enter a number with %decimals% decimals: "
    if "!numA:~-%decimalsP1%,1!" equ "." goto numOK
    echo The number must have a point and %decimals% decimals
    goto getNumber
    
    :numOK
    set numB=2.54
    
    set "fpA=%numA:.=%"
    set "fpB=%numB:.=%"
    
    set /A add=fpA+fpB, sub=fpA-fpB, mul=fpA*fpB/one, div=fpA*one/fpB
    
    echo %numA% + %numB% = !add:~0,-%decimals%!.!add:~-%decimals%!
    echo %numA% - %numB% = !sub:~0,-%decimals%!.!sub:~-%decimals%!
    echo %numA% * %numB% = !mul:~0,-%decimals%!.!mul:~-%decimals%!
    echo %numA% / %numB% = !div:~0,-%decimals%!.!div:~-%decimals%!
    

    例如:

    Enter a number with 2 decimals: 3.76
    3.76 + 2.54 = 6.30
    3.76 - 2.54 = 1.22
    3.76 * 2.54 = 9.55
    3.76 / 2.54 = 1.48
    
        3
  •  3
  •   Jeff Yates    16 年前

    this reference ,DOS批处理语言中没有浮点类型:

    虽然DOS批处理编程语言中确实存在变量,但它们非常有限。没有整数、指针或浮点变量类型,只有字符串。

    我认为,如果不实施自己的除法方案来明确计算余数,您尝试做的事情将是不可能的。

        4
  •  2
  •   mousio    15 年前

    我最近遇到这个批处理文件来计算Pi的近似值。 DivideByInteger 可能对您有用的标签: Stupid-Coding-Tricks-A-Batch-of-Pi

    MaxQuadIndex

    :DivideByInteger
        if defined PiDebug echo.DivideByInteger %1 %2
        set /a DBI_Carry = 0
        for /L %%i in (!MaxQuadIndex!, -1, 0) do (
            set /a DBI_Digit = DBI_Carry*10000 + %1_%%i
            set /a DBI_Carry = DBI_Digit %% %2
            set /a %1_%%i = DBI_Digit / %2
        )
        goto :EOF
    

    A. Print 标签也可用

        5
  •  2
  •   Community Mohan Dere    6 年前

    试试这个

    SETLOCAL EnableExtensions EnableDelayedExpansion
    call :calc_ 1 (99-(100*5/100^)^)
    echo !calc_v!
    goto :EOF
    :calc_
    set scale_=1
    set calc_v=
    for /l %%i in (1,1,%1) do set /a scale_*=10
    set /a "calc_v=!scale_!*%2"
    set /a calc_v1=!calc_v!/!scale_!
    set /a calc_v2=!calc_v!-!calc_v1!*!scale_!
    set calc_v=!calc_v1!.!calc_v2!
    goto :EOF
    

    调用:计算分点方程

    在这个例子中

    小数点是1

    等式为(99-(100*5/100^);确保使用()时插入^before),如^

    答案是94.0

        6
  •  1
  •   Brandon Hicken    10 年前

    我专门写了一个纯批处理文件来做除法。它接受您输入的第一个数字,然后将其除以第二个数字,并按您指定的小数点数量显示结果。

    Echo off
    cls
    if NOT "%3" == "" (
    set n1=%1
    set n2=%2
    set max=%3
    goto :begin
    )
    
    set counter=2
    set n1=1
    set n2=1
    set ans=
    :start
    Echo.
    Echo. 1 / 2
    Echo.
    Set /p N1= 1?
    set /p N2= 2?
    Set /p Max= Out how many Decimal Points?
    :begin
    set /a TmpAns=%N1%/%N2%
    set ans=%TmpAns%.
    :: Echo.%ans%.>Answer.txt
    <nul set /p "=%Tmpans%."
    set /a TmpSub=%N2%*%TmpAns%
    set /a N1=%N1%-%TmpSub%
    set N1=%N1%0
    If NOT "%n1%" == "00" (
    if %n1% LSS %N2% (
    set N1=%N1%0
    set ans=%ans%0
    )
    ) else (
    Goto :Finished
    )
    set count=0
    
    :loop
    If "%count%" == "%max%" (
    Goto :Finished
    )
    
    set /a TmpAns=%N1%/%N2%
    set ans=%ans%%TmpAns%
    <nul set /p "=%Tmpans%"
    set /a TmpSub=%N2%*%TmpAns%
    set /a N1=%N1%-%TmpSub%
    set N1=%N1%0
    If NOT "%n1%" == "00" (
    if %n1% LSS %N2% (
    set N1=%N1%0
    set ans=%ans%0
    )
    ) else (
    Goto :Finished
    )
    set /a count=%count%+1
    goto :loop
    
    :finished
    cls
    Echo.
    Echo.
    Echo.The Number
    Echo.%ans%
    Echo.
    Echo.
    set n1=1
    set n2=1
    pause
    goto :eof
    
    :eof
    

    答案放入变量%Ans%。也可以使用参数调用它。(“除以.bat 50 27 5“将得到50/27的5个小数点。)

        7
  •  0
  •   Krisztian Kaszas    5 年前

    例子

    set divident=10
    set divisor=3
    for /f "delims=" %%a in ('powershell -Command %divident%/%divisor%') do set result=%%a
    @echo %result%
    

    解释 :

    输入变量:使用集合变量定义divident和divisor。

    调用powershell并将结果分配给批处理变量: (您也可以在此处查看: How to put a single PowerShell output string into a cmd variable? )

    注:上述代码仅适用于整数输入变量。

    例子 :

    set divident=10,5
    set divisor=3,4
    for /f "delims=" %%a in ('powershell -Command [convert]::ToDouble^(\"%divident%\"^)
                                            /[convert]::ToDouble^(\"%divisor%\"^)') do set result=%%a
    @echo %result%
    

    :

    请注意,在PowerShell中,您可以这样做 . 但是,在批处理中,我们需要使用反斜杠转义引号,并且我们还需要在引用的部分前后添加“^”符号:

        8
  •  0
  •   Adisak    5 年前

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

    我已经写了一个小的助手库,你可以调用它来完成这个任务。

    EvalBat Library on GitHub

    推荐文章