[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

【练习-034】批处理浮点计算

出题目的:
 掌握批处理浮点计算的方法
加分标准:
 视情形加分,满分20分
解题限制:
 版主级的暂请观看,但可以做解题提示
题目如下:
 输入任意两个小数(小数点后最多为两位数),通过批处理输出两数的和、差、积、商
(积、商均保留两位小数)。

[ 本帖最后由 batman 于 2009-2-13 17:22 编辑 ]
***共同提高***

调用powershell运算就可以了

TOP

调用powershell来做数学计算吧,纯BAT光计算就很复杂了,若还要实现其他功能,真是难以想象。
时间效率不高,胜在代码简单。
  1. set/p "input=输入表达示:
  2. for /f "delims=" %%a in ('powershell "%input%"') do echo %%a
  3. pause
复制代码

TOP

本帖最后由 taofan712 于 2017-3-20 15:27 编辑

回复 20# batman

最开始我也这样想,后来觉得太多意外,需要很多if。
然后我选择先把数字放大到没有小数点再计算,计算完毕再缩小倍数。
为了追求根据输入算式直接得出答案(而不是列举加减乘除4种结果),导致代码多了一半,不然代码应该在48行左右。
  1. @echo off&setlocal enabledelayedexpansion
  2. title 批处理小数运算。
  3. set /p input=输入算式(如 2.96+0.907) :
  4. for /f "tokens=1,2 delims=+-*/" %%a in ("%input%") do (
  5. set x=%%a & set y=%%b
  6. call set symbol=%%input:%%a=%%
  7. call set symbol=%%symbol:%%b=%%
  8. )
  9. set /p precision=自定义精度(默认为3):
  10. if not defined precision set precision=3
  11. set /a xsd=1
  12. for /l %%a in (1 1 %precision%) do set /a xsd*=10
  13. echo;
  14. rem echo;思路:先将数字放大%xsd%倍,得到结果再缩小%xsd%倍。
  15. set/p=%x%  %symbol% %y% 的值为:<nul
  16. call :largen x %precision%
  17. call :largen y %precision%
  18. if "%symbol%"=="*" set expression=x*y & set /a z=!expression!/%xsd%
  19. if "%symbol%"=="/" set expression=x/y & set /a z=!expression!*%xsd%
  20. if "%symbol%"=="+" set expression=x+y & set /a z=!expression!
  21. if "%symbol%"=="-" set expression=x-y & set /a z=!expression!
  22. call :output z
  23. echo;
  24. pause&exit /b
  25. :largen              
  26. setlocal
  27. set bignum=!%~1!
  28. set /a _precision=%~2 + 1
  29. for /l %%n in (1,1,%_precision%) do set zero=!zero!0
  30. set multiple=1%zero%
  31. for /f "tokens=1,2 delims=. " %%a in ("%bignum%") do (
  32. set bignum_b=%%a&set bignum_e=%%b%zero%
  33. )
  34. set bignum_e=1!bignum_e:~0,%_precision%!
  35. set /a smallnum=bignum_b*multiple+bignum_e
  36. set /a smallnum+=5
  37. set /a smallnum-=multiple
  38. set smallnum=%smallnum:~0,-1%
  39. endlocal & set %~1=%smallnum%
  40. goto :eof
  41.   
  42. :lessen
  43. setlocal
  44. set smallnum=!%~1!
  45. set _precision=%~2
  46. for /l %%n in (1,1,%_precision%) do set zero=!zero!0
  47. set multiple=1%zero%
  48. set /a bignum_b=smallnum/multiple
  49. set /a bignum_e=smallnum%%multiple
  50. set bignum_e=%zero%%bignum_e%
  51. set bignum_e=!bignum_e:~-%_precision%!
  52. set bignum=%bignum_b%.%bignum_e%
  53. endlocal & set %~1=%bignum%
  54. goto :eof
  55. :output
  56. call :lessen %~1 %precision%
  57. set/p= !z!<nul
  58. goto :eof
复制代码
1

评分人数

TOP

我发一个自己做的,是除法运算,被除数,除数都可以为小数,支持负数。
最小分度值为10^-8,可以酌情提升,不过效率会降低。
主要思路:
1、将小数化为整数,具体做法是计算被除数和除数小数部分字串的长度,若被除数的小数部分长度大于除数的小数部分的长度,则在除数的小数部分后补上0,直到除数的小数部分的长度与被除数的小数部分的长度一样,反之亦然,再去掉小数点,将被除数和除数前面的0去掉。
2、开始运算:商=被除数 整除 除数
             余数=被除数 取余 除数
             如果余数不等于0,商=商. 否则 完成
             计数器=0
             循环体
             如果余数等于0,跳出循环体
              循环嵌套,8次,循环变量为a
               如果余数比除数小,(
                       余数*=10
                       如果循环变量大于2,商=商0
                       判断结束
              循环嵌套结束
             余数与除数的商=余数 整除 除数
             余数=余数 取余 除数
             商=商余数与除数的商       ::两个字符串连接
             计数器加1
                    如果计数器大于10,跳出循环体
             循环体结束
  1. @echo off
  2. rem 已封装
  3. setlocal enabledelayedexpansion
  4. set ctr=0
  5. set "bc=%~1"
  6. set "c=%~2"
  7. set f=false
  8. if "!bc:~0,1!"=="-" if "!c:~0,1!"=="-" (
  9. set bc=!bc:-=!
  10. set c=!c:-=!
  11. set bc=!bc: =!
  12. set c=!c: =!
  13. set f=false
  14. ) else (
  15. rem nothing
  16. )
  17. if "!bc:~0,1!"=="-" if "!c:~0,1!" neq "-" (
  18. set bc=!bc:-=!
  19. set bc=!bc: =!
  20. set f=true
  21. ) else (
  22. rem nothing
  23. )
  24. if "!bc:~0,1!" neq "-" if "!c:~0,1!"=="-" (
  25. set c=!c:-=!
  26. set c=!c: =!
  27. set f=true
  28. ) else (
  29. rem nothing
  30. )
  31. set tbc=!bc!
  32. set tc=!c!
  33. set tbc=!tbc:.=!
  34. set tc=!tc:.=!
  35. set tbc=!tbc: =!
  36. set tc=!tc: =!
  37. if !"tbc!" neq "!bc!" if  "!tc!" neq "!c!" (
  38. for /f "delims=. tokens=1-3 eol=a" %%a in ('echo !bc!') do (
  39.   call :len %%b
  40.   set lenbcx=!zz!
  41. )
  42. for /f "delims=. tokens=1-3 eol=a" %%a in ('echo !c!') do (
  43.   call :len %%b
  44.   set lencx=!zz!
  45. )
  46. ) else (
  47. goto :r
  48. )
  49. if !lenbcx! gtr !lencx! (
  50. set /a cz=lenbcx-lencx
  51. for /l %%a in (1,1,!cz!) do (set c=!c!0)
  52. set c=!c:.=!
  53. set c=!c: =!
  54. set bc=!bc:.=!
  55. set bc=!bc: =!
  56. ) else (
  57. if !lenbcx!==!lencx! set bc=!bc:.=! & set c=!c:.=! & set bc=!bc: =! & set c=!c: =! & goto :r
  58. set /a cz=lencx-lenbcx
  59. for /l %%a in (1,1,!cz!) do (set bc=!bc!0)
  60. set c=!c:.=!
  61. set c=!c: =!
  62. set bc=!bc:.=!
  63. set bc=!bc: =!
  64. )
  65. :r
  66. for /l %%a in (1,1,9) do (if "!bc:~0,1!"=="0" set bc=!bc:~1!)
  67. for /l %%a in (1,1,9) do (if "!c:~0,1!"=="0" set c=!c:~1!)
  68. set /a "s=bc/c"
  69. set /a "m=bc %% c"
  70. if !m!==0 goto :f
  71. set s=!s!.
  72. :main
  73. if !m!==0 goto :f
  74. for /l %%a in (1,1,8) do (
  75. if !m! lss !c! (
  76.   set /a m=m*10
  77.   if %%a geq 2 set s=!s!0 & set /a ctr+=1
  78. ) else (
  79. rem nothing
  80. )
  81. )
  82. set /a "ss=m/c"
  83. set /a "m=m %% !c!"
  84. set s=!s!!ss!
  85. set s=!s: =!
  86. set /a ctr+=1
  87. if !ctr! gtr 10 goto :f
  88. goto :main
  89. :f
  90. if !f!==false (
  91. echo !s!
  92. ) else (
  93. echo -!s!
  94. )
  95. goto :eof
  96. :len
  97. set "t=%1"
  98. set zz=0
  99. for /l %%a in (0,1,11) do (
  100. if "!t:~%%a,1!"=="" goto :eof
  101. set /a zz+=1
  102. )
  103. goto:eof
复制代码

TOP

回复 30# zhengdalu


如果你觉得不支持,为何还有25楼的疑问呢?
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

我觉得不支持,可是楼主...怎么这么问啊

TOP

回复 28# zhengdalu


嗯,根据你试的结果,你觉得支持吗?
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

回复 26# Batcher


    我试过,窗口只给显示整数位,小数没有啊。

TOP

本帖最后由 guaiwu 于 2011-9-22 20:24 编辑
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set /p q=请输入两个小数:
  4. for %%i in (%q%) do (
  5. set /a a+=1
  6. set a!a!=%%i
  7. )
  8. set /a a=%a1%+%a2%
  9. set /a b=%a1%-%a2%
  10. set /a c=%a1%*%a2%
  11. set /a d=%a1%/%a2%
  12. echo 两个小数的和为%a%
  13. echo 两个小数的差为%b%
  14. echo 两个小数相乘为%c%
  15. echo 两个小数相除为%d%
  16. pause
复制代码
莫求昨天无悔,但愿今日无愧。

TOP

回复 25# zhengdalu


你自己试试就知道啦
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

这...我新手,请问不是批处理不支持浮点吗

TOP

回复 5# BBCC
for /f "delims=" %%a in ('%0') do (echo %%a)
是你搞错了('%0'因为"%0"),还是有什么其他的意思——我运行后批处理就不动了。

TOP

商的取值不怎么准确。。
如23/36 你写的批处理的结果是0.63
但实际上是0.638888循环。。。
所以取值应该是0.64

TOP

练练手。基本思路是化小数为整数运算,得到结果后再恢复成小数。
不支持大数字运算。特别是乘法部分有待完善,需要考虑的成分的确太多了。可能有批漏之处
  1. @echo off&setlocal enabledelayedexpansion
  2. :begin
  3. set /p m=输入(q退出):
  4. if "!m!"=="q" goto :eof
  5. set /p n=输入:
  6. for /f "tokens=1,2 delims=." %%i in ("%m%") do set m1=%%j00&if not "%%j"=="" (set mm=%%i!m1:~0,2!) else set mm=%%i00
  7. for /f "tokens=1,2 delims=." %%i in ("%n%") do set n1=%%j00&if not "%%j"=="" (set nn=%%i!n1:~0,2!) else set nn=%%i00
  8. if "!mm:~0,1!"=="-" (set mm=!mm:~1!&set /a num=2!mm!-1!mm!,mm=1!mm!-num&set mm=-!mm!) else set /a num=2!mm!-1!mm!,mm=1!mm!-num
  9. if "!nn:~0,1!"=="-" (set nn=!nn:~1!&set /a num=2!nn!-1!nn!,nn=1!nn!-num&set nn=-!nn!) else set /a num=2!nn!-1!nn!,nn=1!nn!-num
  10. set /a add=mm+nn
  11. call :check !add! num1
  12. echo 两值之和是: !num1!
  13. set /a sub=mm-nn
  14. call :check !sub! num2
  15. echo 两值之差是: !num2!
  16. set /a mul=mm*nn
  17. if !mul! lss 100 (set num3=0.00) else (
  18. set mul=!mul:~0,-2!
  19. call :check !mul! num3
  20. )
  21. echo 其积为:!num3!
  22. set /a div=100*mm/nn
  23. call :check !div! num4
  24. echo 其商为:%num4%
  25. goto begin
  26. :check
  27. set var=%1&set "_="
  28. if !var! lss 0 (set /a var=-1*var&set _=-)
  29. if !var! lss 10 (set var=00!var!) else if !var! lss 100 set var=0!var!
  30. if "!var:~-2!"=="00" (set var=!var:~0,-2!) else if "!var:~-1!"=="0" (set var=!var:~0,-2!.!var:~-2,1!) else set var=!var:~0,-2!.!var:~-2!
  31. set %2=!_!!var!&goto :eof
复制代码

TOP

返回列表