中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

中国DOS联盟论坛
现在时间是 2026-06-23 09:41
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 批处理计算小数 查看 1,002 回复 10
楼 主 批处理计算小数 发表于 2008-07-21 20:13 ·  中国 山东 淄博 联通
银牌会员
★★★
积分 1,604
发帖 646
注册 2008-04-13 23:39
18年会员
UID 115804
性别 男
状态 离线
被除数与除数可支持输入小数,没有进行过多的排错处理,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 : %c%.%mo%) else echo : %c%
pause>nul&goto 1
心绪平和,眼藏静谧,无比安稳的火... Purification of soul...Just a false...^_^
2 发表于 2008-07-21 20:31 ·  中国 湖南 株洲 电信
金牌会员
★★★★
永远的学习者
积分 3,105
发帖 1,276
注册 2008-03-08 13:00
18年会员
UID 112398
性别 男
状态 离线
未及细看,只是觉得兄弟变量清空可以简化(当然要涉及到修改下面的代码):
for /f "delims==" %%i in ('set _') do set "%%i=" ,代码是有点。。。

[ Last edited by zw19750516 on 2008-7-21 at 09:53 PM ]
批处理之家新域名:www.bathome.net
3 发表于 2008-07-21 20:36 ·  中国 山东 淄博 联通
银牌会员
★★★
积分 1,604
发帖 646
注册 2008-04-13 23:39
18年会员
UID 115804
性别 男
状态 离线
不明白。。。
set "_*="
具体怎样才能清空变量?
心绪平和,眼藏静谧,无比安稳的火... Purification of soul...Just a false...^_^
4 发表于 2008-07-21 20:38 ·  中国 湖南 株洲 电信
金牌会员
★★★★
永远的学习者
积分 3,105
发帖 1,276
注册 2008-03-08 13:00
18年会员
UID 112398
性别 男
状态 离线
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 ]
批处理之家新域名:www.bathome.net
5 发表于 2008-07-21 20:41 ·  中国 广东 广州 花都区 电信
银牌会员
★★★★
SuperCleaner
积分 2,362
发帖 1,133
注册 2008-02-02 21:36
18年会员
UID 110072
性别 男
状态 离线
清空变量应该就是 直接set n=吧
6 发表于 2008-07-21 20:49 ·  中国 山东 淄博 联通
银牌会员
★★★
积分 1,604
发帖 646
注册 2008-04-13 23:39
18年会员
UID 115804
性别 男
状态 离线
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 ]


受教!
心绪平和,眼藏静谧,无比安稳的火... Purification of soul...Just a false...^_^
7 发表于 2008-07-21 20:50 ·  中国 湖南 株洲 电信
金牌会员
★★★★
永远的学习者
积分 3,105
发帖 1,276
注册 2008-03-08 13:00
18年会员
UID 112398
性别 男
状态 离线

@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 ]
批处理之家新域名:www.bathome.net
8 发表于 2008-07-21 21:04 ·  中国 山东 淄博 联通
银牌会员
★★★
积分 1,604
发帖 646
注册 2008-04-13 23:39
18年会员
UID 115804
性别 男
状态 离线
我发现在每个变量前加_ 连清空变量的for语句 一共增加了几十个字符,减去我的那种清空变量方法的字符数,还是多出几十个。。。
看来这种方法只是对清空变量简洁 对于整个代码来说,又繁杂了一点。。
心绪平和,眼藏静谧,无比安稳的火... Purification of soul...Just a false...^_^
9 发表于 2008-07-21 21:06 ·  中国 湖南 株洲 电信
金牌会员
★★★★
永远的学习者
积分 3,105
发帖 1,276
注册 2008-03-08 13:00
18年会员
UID 112398
性别 男
状态 离线
如果你有上万个要清空的变量呢?
批处理之家新域名:www.bathome.net
10 发表于 2008-07-21 21:11 ·  中国 湖南 娄底 电信
银牌会员
★★★
积分 2,268
发帖 879
注册 2006-12-19 16:23
19年会员
UID 73968
性别 男
状态 离线
太多的变量需清空时最好 调整代码 用 setlocal 和 endlocal 是最理想的。
致精致简!
11 发表于 2008-07-21 21:12 ·  中国 山东 淄博 联通
银牌会员
★★★
积分 1,604
发帖 646
注册 2008-04-13 23:39
18年会员
UID 115804
性别 男
状态 离线
嗯 有道理。。。
如果变量上百上千个,这种方法的确简洁。但这个批处理大小恐怕到了几M或者十几M。。。 一般的机器运行不了。
心绪平和,眼藏静谧,无比安稳的火... Purification of soul...Just a false...^_^
论坛跳转: