Board logo

标题: [数值计算] [分享]批处理四舍五入函数 [打印本页]

作者: ht河豚    时间: 2014-8-14 13:53     标题: [分享]批处理四舍五入函数

本帖最后由 ht河豚 于 2014-8-29 08:59 编辑

发给大家一个能四舍五入的函数,自己写的.
论坛好像还没有这方面的内容,自己写了这么一个函数.
貌似等级不够所以发到这里,方便大家使用
可以修改函数内kp的变量值
达到修改保留位数的目的(kp=2即为保留2位小数)
(本来想把这个做成一个选项的,太懒了)
  1. :int 小数 保存的变量
  2. @echo off&setlocal enabledelayedexpansion
  3. set int=%~1
  4. set kp=2
  5. for /f "tokens=1,2 delims=." %%i in ("!int!") do (
  6. if "%%j"=="" (endlocal&set %~2=%int%&goto :eof)
  7. set pf=%%j
  8. set pfd=!pf:~0,%kp%!
  9. set pfc=!pf:~%kp%,1!
  10. if "!pfc!"=="0" (
  11. if !pfc! GEQ 5 set /a result=%%i+1
  12. if !pf! LSS 5 set /a result=%%i
  13. )
  14. if not "!pfc!"=="0" (
  15. if !pfc! GEQ 5 set /a tmp=!pfd!+1
  16. if !pfc! LSS 5 set /a tmp=!pfd!
  17. set result=%%i.!tmp!
  18. )
  19. )
  20. endlocal&set %~2=%result%&goto :eof
复制代码
刚刚那个好像有很多BUG,修改了V2结果发现仅能在小数使用
又修了V3这回应该没什么问题了
======V3======
  1. :int 小数 输出变量
  2. setlocal enabledelayedexpansion
  3. set int=%~1.
  4. if not defined kp set kp=2
  5. if "%kp%"=="0" (set int=!int!0) Else for /l %%i in (1 1 %kp%) do set int=!int!0
  6. for /f "tokens=1,2,3 delims=." %%i in ("!int!") do (
  7. if not "%kp%"=="0" if %%j EQU 0 (endlocal&set %~2=%%i.%%j&goto :eof)
  8. echo !int!
  9. set pf=%%j
  10. set pfe=!pf:~0,1!
  11. set pfd=!pf:~0,%kp%!
  12. set pfc=!pf:~%kp%,1!
  13. if "!kp!"=="0" (
  14. if !pfe! GEQ 5 set /a result=%%i+1
  15. if !pfe! LSS 5 set /a result=%%i
  16. ) ELSE (
  17. if !pfc! GEQ 5 set /a tmp1=!pfd!+1
  18. if !pfc! LSS 5 set /a tmp1=!pfd!
  19. set result=%%i.!tmp1!
  20. )
  21. )
  22. endlocal&set %~2=%result%&goto :eof
复制代码

作者: zwlking    时间: 2014-8-14 16:15

谢谢你的分享!
作者: oqis    时间: 2015-3-31 15:03

这个函数怎么用?能举例说明末。
作者: oqis    时间: 2015-3-31 15:04

这个函数怎么用?能举例说明末。
作者: CrLf    时间: 2015-3-31 15:55

回复 4# oqis


举个栗子:
  1. @echo off
  2. set "输入变量=44.1234560"
  3. ::要处理的数字
  4. set "kp=1"
  5. ::保留 1 位小数
  6. call :int %输入变量% 输出变量
  7. ::调用 :int 并将结果保存在 %输出变量% 中
  8. echo %输出变量%
  9. pause & exit
  10. :int 小数 输出变量
  11. setlocal enabledelayedexpansion
  12. set int=%~1.
  13. if not defined kp set kp=2
  14. if "%kp%"=="0" (set int=!int!0) Else for /l %%i in (1 1 %kp%) do set int=!int!0
  15. for /f "tokens=1,2,3 delims=." %%i in ("!int!") do (
  16. if not "%kp%"=="0" if %%j EQU 0 (endlocal&set %~2=%%i.%%j&goto :eof)
  17. echo !int!
  18. set pf=%%j
  19. set pfe=!pf:~0,1!
  20. set pfd=!pf:~0,%kp%!
  21. set pfc=!pf:~%kp%,1!
  22. if "!kp!"=="0" (
  23. if !pfe! GEQ 5 set /a result=%%i+1
  24. if !pfe! LSS 5 set /a result=%%i
  25. ) ELSE (
  26. if !pfc! GEQ 5 set /a tmp1=!pfd!+1
  27. if !pfc! LSS 5 set /a tmp1=!pfd!
  28. set result=%%i.!tmp1!
  29. )
  30. )
  31. endlocal&set %~2=%result%&goto :eof
复制代码

作者: oqis    时间: 2015-3-31 18:00

本帖最后由 oqis 于 2015-3-31 18:26 编辑

回复 5# CrLf
知道了 多谢
结果是对的,但不知道有没有简单点的方法。
四舍五入 保留小数点后2位
%ConSet_prec%好像可以,但不知道用。
作者: pda8888    时间: 2023-3-28 19:23

用这个数测试,69.0916165972,要报错且结果不对:
  1. 69.0916165972
  2. 69.091616.00
  3. 无效数字。数字常数只能是十进制(17),十六位进制(0x11)或
  4. 八进制(021)。
  5. 69.
复制代码





欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2