标题: 批处理计算小数
[打印本页]
作者: pusofalse
时间: 2008-7-21 20:13
标题: 批处理计算小数
被除数与除数可支持输入小数,没有进行过多的排错处理,CMD所能处理的最大数值等问题,依旧存在,代码也比较臃肿,初步测试无出错。欢迎赐教!~
@echo off&setlocal enabledelayedexpansion
:1
cls&for %%a in (numeric1 numeric2 xxx n1 n2 #1 #2 a b z zero c mod d x mo ) do set "%%a="
echo.&echo.&echo.&set/p numeric1= 输入被除数: &echo.&set/p numeric2= 输入除数:
echo.&set/p xxx= 输入要保留的小数点位数:
for %%a in (1 2) do echo !numeric%%a!|find ".">nul&&set n%%a=!numeric%%a:*.=!
for %%i in (1 2) do (
if defined n%%i (
for /l %%a in (0 1 10) do (
if "!n%%i:~%%a,1!" neq "" set #%%i=%%a
)
)
)
for %%a in (1 2) do if defined #%%a (set/a #%%a+=1) else set #%%a=0
if !#1! geq !#2! (
set/a z=!#1!-!#2!,a=%numeric1:.=%,b=%numeric2:.=%
) else (
set/a z=!#2!-!#1!,a=%numeric2:.=%,b=%numeric1:.=%
)
for /l %%a in (1 1 %z%) do set zero=!zero!0
set a=%a:.=%&set b=%b:.=%%zero%
if %a% lss %b% set a=%b%&set b=%a%
set/a c=a/b
:begin
set/a mod=a%%b
set a=%mod%0
set/a d=a/b
set/a x+=1
if %x% neq %xxx% (
set mo=!mo!%d%
goto begin
) else (
if %d% geq 5 (
set/a d+=1
set mo=!mo!!d!
)
)
:res
if %mo:~-1% equ 0 (
set mo=%mo:~,-1%
goto res
)
echo.&if defined mo (echo [result]: %c%.%mo%) else echo [result]: %c%
pause>nul&goto 1
作者: bat-zw
时间: 2008-7-21 20:31
未及细看,只是觉得兄弟变量清空可以简化(当然要涉及到修改下面的代码):
for /f "delims==" %%i in ('set _') do set "%%i=" ,代码是有点。。。
[
Last edited by zw19750516 on 2008-7-21 at 09:53 PM ]
作者: pusofalse
时间: 2008-7-21 20:36
不明白。。。
set "_*="
具体怎样才能清空变量?
作者: bat-zw
时间: 2008-7-21 20:38
Quote: |
Originally posted by pusofalse at 2008-7-21 20:36:
不明白。。。
搞错了,应该是 for /f "delims==" %%i in ('set _') do set "%%i="
具体怎样才能清空变量? |
|
把你的变量都设置成set _*=,如set "_%n%=%n%"
[
Last edited by zw19750516 on 2008-7-21 at 09:53 PM ]
作者: 523066680
时间: 2008-7-21 20:41
清空变量应该就是 直接set n=吧
作者: pusofalse
时间: 2008-7-21 20:49
Quote: |
Originally posted by zw19750516 at 2008-7-21 08:38 PM:
把你的变量都设置成set _*=,如set "_%n%=%n%"
[ Last edited by zw19750516 on 2008-7-21 at 08:45 PM ] |
|
受教!
作者: bat-zw
时间: 2008-7-21 20:50
@echo off
for /l %%i in (1,1,10) do set "_%%i=%%i"
echo 清空前:
for /l %%i in (1,1,10) do call,echo %%_%%i%%
for /f "delims==" %%i in ('set _') do set "%%i="
pause&cls&echo 清空后:
for /l %%i in (1,1,10) do call,echo %%_%%i%%
pause>nul
[
Last edited by zw19750516 on 2008-7-21 at 09:52 PM ]
作者: pusofalse
时间: 2008-7-21 21:04
我发现在每个变量前加_ 连清空变量的for语句 一共增加了几十个字符,减去我的那种清空变量方法的字符数,还是多出几十个。。。
看来这种方法只是对清空变量简洁 对于整个代码来说,又繁杂了一点。。
作者: bat-zw
时间: 2008-7-21 21:06
如果你有上万个要清空的变量呢?
作者: 26933062
时间: 2008-7-21 21:11
太多的变量需清空时最好 调整代码 用 setlocal 和 endlocal 是最理想的。
作者: pusofalse
时间: 2008-7-21 21:12
嗯 有道理。。。
如果变量上百上千个,这种方法的确简洁。但这个批处理大小恐怕到了几M或者十几M。。。 一般的机器运行不了。