标题: [数值计算] [分享]批处理四舍五入函数 [打印本页]
作者: ht河豚 时间: 2014-8-14 13:53 标题: [分享]批处理四舍五入函数
本帖最后由 ht河豚 于 2014-8-29 08:59 编辑
发给大家一个能四舍五入的函数,自己写的.
论坛好像还没有这方面的内容,自己写了这么一个函数.
貌似等级不够所以发到这里,方便大家使用
可以修改函数内kp的变量值
达到修改保留位数的目的(kp=2即为保留2位小数)
(本来想把这个做成一个选项的,太懒了)- :int 小数 保存的变量
- @echo off&setlocal enabledelayedexpansion
- set int=%~1
- set kp=2
- for /f "tokens=1,2 delims=." %%i in ("!int!") do (
- if "%%j"=="" (endlocal&set %~2=%int%&goto :eof)
- set pf=%%j
- set pfd=!pf:~0,%kp%!
- set pfc=!pf:~%kp%,1!
- if "!pfc!"=="0" (
- if !pfc! GEQ 5 set /a result=%%i+1
- if !pf! LSS 5 set /a result=%%i
- )
- if not "!pfc!"=="0" (
- if !pfc! GEQ 5 set /a tmp=!pfd!+1
- if !pfc! LSS 5 set /a tmp=!pfd!
- set result=%%i.!tmp!
- )
- )
- endlocal&set %~2=%result%&goto :eof
复制代码
刚刚那个好像有很多BUG,修改了V2结果发现仅能在小数使用
又修了V3这回应该没什么问题了
======V3======- :int 小数 输出变量
- setlocal enabledelayedexpansion
- set int=%~1.
- if not defined kp set kp=2
- if "%kp%"=="0" (set int=!int!0) Else for /l %%i in (1 1 %kp%) do set int=!int!0
- for /f "tokens=1,2,3 delims=." %%i in ("!int!") do (
- if not "%kp%"=="0" if %%j EQU 0 (endlocal&set %~2=%%i.%%j&goto :eof)
- echo !int!
- set pf=%%j
- set pfe=!pf:~0,1!
- set pfd=!pf:~0,%kp%!
- set pfc=!pf:~%kp%,1!
- if "!kp!"=="0" (
- if !pfe! GEQ 5 set /a result=%%i+1
- if !pfe! LSS 5 set /a result=%%i
- ) ELSE (
- if !pfc! GEQ 5 set /a tmp1=!pfd!+1
- if !pfc! LSS 5 set /a tmp1=!pfd!
- set result=%%i.!tmp1!
- )
- )
- 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
举个栗子:- @echo off
-
- set "输入变量=44.1234560"
- ::要处理的数字
-
- set "kp=1"
- ::保留 1 位小数
-
- call :int %输入变量% 输出变量
- ::调用 :int 并将结果保存在 %输出变量% 中
-
- echo %输出变量%
-
- pause & exit
-
-
-
- :int 小数 输出变量
- setlocal enabledelayedexpansion
- set int=%~1.
- if not defined kp set kp=2
- if "%kp%"=="0" (set int=!int!0) Else for /l %%i in (1 1 %kp%) do set int=!int!0
- for /f "tokens=1,2,3 delims=." %%i in ("!int!") do (
- if not "%kp%"=="0" if %%j EQU 0 (endlocal&set %~2=%%i.%%j&goto :eof)
- echo !int!
- set pf=%%j
- set pfe=!pf:~0,1!
- set pfd=!pf:~0,%kp%!
- set pfc=!pf:~%kp%,1!
- if "!kp!"=="0" (
- if !pfe! GEQ 5 set /a result=%%i+1
- if !pfe! LSS 5 set /a result=%%i
- ) ELSE (
- if !pfc! GEQ 5 set /a tmp1=!pfd!+1
- if !pfc! LSS 5 set /a tmp1=!pfd!
- set result=%%i.!tmp1!
- )
- )
- 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,要报错且结果不对:-
- 69.0916165972
- 69.091616.00
- 无效数字。数字常数只能是十进制(17),十六位进制(0x11)或
- 八进制(021)。
- 69.
复制代码
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |