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

返回列表