本帖最后由 taofan712 于 2017-3-20 15:27 编辑
回复 20# batman
最开始我也这样想,后来觉得太多意外,需要很多if。
然后我选择先把数字放大到没有小数点再计算,计算完毕再缩小倍数。
为了追求根据输入算式直接得出答案(而不是列举加减乘除4种结果),导致代码多了一半,不然代码应该在48行左右。- @echo off&setlocal enabledelayedexpansion
- title 批处理小数运算。
- set /p input=输入算式(如 2.96+0.907) :
- for /f "tokens=1,2 delims=+-*/" %%a in ("%input%") do (
- set x=%%a & set y=%%b
- call set symbol=%%input:%%a=%%
- call set symbol=%%symbol:%%b=%%
- )
- set /p precision=自定义精度(默认为3):
- if not defined precision set precision=3
- set /a xsd=1
- for /l %%a in (1 1 %precision%) do set /a xsd*=10
- echo;
- rem echo;思路:先将数字放大%xsd%倍,得到结果再缩小%xsd%倍。
- set/p=%x% %symbol% %y% 的值为:<nul
- call :largen x %precision%
- call :largen y %precision%
- if "%symbol%"=="*" set expression=x*y & set /a z=!expression!/%xsd%
- if "%symbol%"=="/" set expression=x/y & set /a z=!expression!*%xsd%
- if "%symbol%"=="+" set expression=x+y & set /a z=!expression!
- if "%symbol%"=="-" set expression=x-y & set /a z=!expression!
- call :output z
- echo;
- pause&exit /b
-
- :largen
- setlocal
- set bignum=!%~1!
- set /a _precision=%~2 + 1
- for /l %%n in (1,1,%_precision%) do set zero=!zero!0
- set multiple=1%zero%
- for /f "tokens=1,2 delims=. " %%a in ("%bignum%") do (
- set bignum_b=%%a&set bignum_e=%%b%zero%
- )
- set bignum_e=1!bignum_e:~0,%_precision%!
- set /a smallnum=bignum_b*multiple+bignum_e
- set /a smallnum+=5
- set /a smallnum-=multiple
- set smallnum=%smallnum:~0,-1%
- endlocal & set %~1=%smallnum%
- goto :eof
-
- :lessen
- setlocal
- set smallnum=!%~1!
- set _precision=%~2
- for /l %%n in (1,1,%_precision%) do set zero=!zero!0
- set multiple=1%zero%
- set /a bignum_b=smallnum/multiple
- set /a bignum_e=smallnum%%multiple
- set bignum_e=%zero%%bignum_e%
- set bignum_e=!bignum_e:~-%_precision%!
- set bignum=%bignum_b%.%bignum_e%
- endlocal & set %~1=%bignum%
- goto :eof
-
- :output
- call :lessen %~1 %precision%
- set/p= !z!<nul
- goto :eof
复制代码
|