欢迎继续测试~
@echo off
title 批处理除法运算脚本 by:Ye - * bbs.cn-dos.net
:start
cls
call :del.bat
echo.
echo bbs.cn-dos.net
echo --------------------------------------------------------------------------------
echo 程序用途: 两个数的除法运算,被除数和除数都可以是小数
echo 使用说明: 1.被除数或除数的整数位和小数位之和最多9位,超过可能会出错
echo 不过通过下面这个例子,原理上被除数可以计算到任意位:
echo 789/9=(7/9)的值补00+(8/9)的值补0+9/9
echo 2.被除数或除数可简写输入,输入下面这些都可以执行: 9. or .9
echo 3.任何位置输入 ^&、^"、^<、^>、^|、空格 中的任何一个都会引起错误
echo 4.如果出现"无效数字。数字精确度限为 32 位",是位数太多了,结果无效
echo --------------------------------------------------------------------------------
set num1_k=
set /p num1_k= 输入被除数:
if == goto start
:: 判断是否为纯数字
call :pan_c_num %num1_k%
:: 判断是否输入两个以上的.
call :q_wei %num1_k%
set num2_k=
set /p num2_k= 输入除数:
if == goto start
call :pan_c_num %num2_k%
call :q_wei %num2_k%
set num1=%num1_k%
set num2=%num2_k%
:: 判断常见的几种情况
if %num2%==0 (echo 错误:除数不可以为0&pause>nul&goto start)
if %num1%==0 (set zhi=0& goto show)
if %num1%==%num2% (set zhi=1& goto show)
if %num1%==. (set zhi=0& goto show)
if %num2%==. (echo 错误:除数不可以为.&pause>nul&goto start)
:: 为.xx xx.和xx补全
>var_.txt echo %num1%
find "." var_.txt>nul&& (if %num1:~0,1%==. set num1=0%num1%
if %num1:~-1,1%==. set num1=%num1%0)||set num1=%num1%.0
>var_.txt echo %num2%
find "." var_.txt>nul&& (if %num2:~0,1%==. set num2=0%num2%
if %num2:~-1,1%==. set num2=%num2%0)||set num2=%num2%.0
:: 算全部的位数
call :q_wei %num1%
set n1_wei=
set /p n1_wei=<var_.txt
call :q_wei %num2%
set n2_wei=
set /p n2_wei=<var_.txt
:: 算小数点以后的位数
call :x_wei %num1% %n1_wei%
set x1_wei=
set /p x1_wei=<var_.txt
set /a x1_wei=x1_wei-1
call :x_wei %num2% %n2_wei%
set x2_wei=
set /p x2_wei=<var_.txt
set /a x2_wei=x2_wei-1
:: 比较小数位大小,并补小数位到位数相同
if %x1_wei%==%x2_wei% goto wei_t
set max_wei=%x1_wei%
if %max_wei% lss %x2_wei% (set max_wei=%x2_wei%)
set /a bu1_wei=%max_wei%-%x1_wei%
set /a bu2_wei=%max_wei%-%x2_wei%
if %bu1_wei%==0 goto bu_w1_ok
call :bu_xwei %bu1_wei%
set x1_wei_0=
set /p x1_wei_0=<var_.txt
set num1=%num1%%x1_wei_0%
:bu_w1_ok
if %bu2_wei%==0 goto bu_w2_ok
call :bu_xwei %bu2_wei%
set x2_wei_0=
set /p x2_wei_0=<var_.txt
set num2=%num2%%x2_wei_0%
:bu_w2_ok
:wei_t
set x_wei=0
:: 去除.
set num1=%num1:.=%
set num2=%num2:.=%
:: 算新的全部的位数
call :q_wei %num1%
set n1_xwei=
set /p n1_xwei=<var_.txt
call :q_wei %num2%
set n2_xwei=
set /p n2_xwei=<var_.txt
:: 位数大于8无法计算,这里,因为set /a 好象最大可以计算到8888888/9999999
if 8 LEQ %n1_xwei% (echo 数字位数太多,暂时计算不了&pause>nul&goto start)
if 8 LEQ %n2_xwei% (echo 数字位数太多,暂时计算不了&pause>nul&goto start)
:: 第一位如果是0就去除
if %num1:~0,1%==0 (
call :qu_0 %num1% %n1_xwei%
set num1=
set /p num1=<var_.txt
)
if %num2:~0,1%==0 (
call :qu_0 %num2% %n2_xwei%
set num2=
set /p num2=<var_.txt
)
:: 这是防止输入0.0 0.00 等 00 000 等=0的数字而无法执行程序
:: 因为当某个数为0时,第一位如果是0就去除,这样这个数就是空了,写入文件的时候为"ECHO 处于关闭状态。"
>var_.txt echo %num1%
find "关闭状态" var_.txt>nul&&(set zhi=0& goto show)
>var_.txt echo %num2%
find "关闭状态" var_.txt>nul&&(echo 错误:除数不可以为0&pause>nul&goto start)
:: 比较大小,1>2才继续运行
:fc_
if %num1% GEQ %num2% goto fc_ok
set /a num1=%num1%*10
set /a x_wei=x_wei+1
goto fc_
:fc_ok
:: 开始计算
call :jisuan %num1% %num2%
set zhi=
set /p zhi=<var_.txt
:: 开始补小数位
if %x_wei%==0 goto show
:: 去除值中的.
set zhi_=
set zhi_=%zhi:.=%
if %x_wei%==1 (
set zhi_=
set zhi=0.%zhi_%
goto show
)
:: 其余就是%x_wei%大于1的情况
set /a x_wei-=1
call :bu_xwei %x_wei%
set zhi_bu=
set /p zhi_bu=<var_.txt
set zhi=
set zhi=0.%zhi_bu%%zhi_%
goto show
:: 显示结果
:show
call :del.bat
echo --------------------------------------------------------------------------------
echo 运算结果:
echo %num1_k%/%num2_k%=%zhi%
echo --------------------------------------------------------------------------------
echo 按任意键继续计算......&pause>nul&goto start
:: $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
:q_wei
set var=
set var=%1
setlocal ENABLEDELAYEDEXPANSION
set n=0
set d_geshu=0
:start_a
set "var_=!var:~%n%,1!"
if "%var_%" == "" goto end_a
:: 记录点的个数
if == set /a d_geshu=d_geshu+1
set /a n=n+1
goto start_a
:end_a
>var_.txt echo %n%
:: 判断.的个数,有两个以上的.退出
if %d_geshu% gtr 1 (echo 错误:被除数或除数只可以由数字和一个.组成&pause>nul&goto start)
goto :eof
:del.bat
if exist var_.txt del /q var_.txt>nul
goto :eof
:x_wei
setlocal ENABLEDELAYEDEXPANSION
set var=
set var=%1
set n=0
:start_b
set "var_=!var:~-%n%,1!"
if "%var_%"=="." goto end_b
set /a n=n+1
if %n%==%2 goto end_b
goto start_b
:end_b
>var_.txt echo %n%
goto :eof
:jisuan
set var1=
set var2=
set n=0
set zhi_x=
set var1=%1
set var2=%2
:start_c
if %var1%==0 goto end_c
set /a zhi=%var1%/%var2%
set /a var1=(var1-%var2%*%zhi%)*10
set /a n=n+1
if %n%==2 (set zhi_x=%zhi_x%.%zhi%) else (set zhi_x=%zhi_x%%zhi%)
:: 这里的if %n%==10是算10次,为了算的更精确,可以设置更大
if %n%==10 goto end_c
goto start_c
:end_c
>var_.txt echo %zhi_x%
goto :eof
:bu_xwei
set var=
set var=%1
set wei=
set n=0
:start_d
set /a n=n+1
set wei=%wei%0
if %n%==%var% goto end_d
goto start_d
:end_d
>var_.txt echo %wei%
goto :eof
:qu_0
set var=
set var=%1
setlocal ENABLEDELAYEDEXPANSION
set n=0
set shu=
:start_e
set "var_=!var:~%n%,1!"
if not "%var_%"=="0" goto end_e
set /a n=n+1
goto start_e
:end_e
:start_e_1
set "var_=!var:~%n%,1!"
set shu=%shu%%var_%
set /a n=n+1
if %n%==%2 goto end_e_1
goto start_e_1
:end_e_1
>var_.txt echo %shu%
goto :eof
:pan_c_num
:: 判断是否为纯数字,先替换了.为空
set var_=%1
set var_=%var_:.=%
>var_.txt echo %var_%
findstr "^*$" var_.txt>nul||(echo 错误:被除数或除数只可以由数字和一个.组成&pause>nul&goto start)
goto :eof

精华I