找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 33129|回复: 6

[数值计算] [分享]批处理四舍五入函数

[复制链接]
发表于 2014-8-14 13:53:14 | 显示全部楼层 |阅读模式
本帖最后由 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
复制代码

评分

参与人数 1技术 +1 收起 理由
wankoilz + 1 加油!

查看全部评分

发表于 2014-8-14 16:15:32 | 显示全部楼层
谢谢你的分享!
发表于 2015-3-31 15:03:35 | 显示全部楼层
这个函数怎么用?能举例说明末。
发表于 2015-3-31 15:04:02 | 显示全部楼层
这个函数怎么用?能举例说明末。
发表于 2015-3-31 15:55:28 | 显示全部楼层
回复 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
复制代码
发表于 2015-3-31 18:00:19 | 显示全部楼层
本帖最后由 oqis 于 2015-3-31 18:26 编辑

回复 5# CrLf
知道了 多谢
结果是对的,但不知道有没有简单点的方法。
四舍五入 保留小数点后2位
%ConSet_prec%好像可以,但不知道用。
发表于 2023-3-28 19:23:00 | 显示全部楼层
用这个数测试,69.0916165972,要报错且结果不对:

  1. 69.0916165972
  2. 69.091616.00
  3. 无效数字。数字常数只能是十进制(17),十六位进制(0x11)或
  4. 八进制(021)。
  5. 69.
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-19 01:02 , Processed in 0.024425 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表