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

[数值计算] 批处理小数转分数,支持循环小数

如果整数部分是0,可以直接省略整数部分。

逗号表示循环节的第一位。
另一个循环点会自动标在最后一位。
例如:
                     .                        . .
0.1,6 ---> 0.16    3.,54 ---> 3.54

思路介绍:
拿0.1666...当例子,我们把它分成3个部分
016
整数部分(a)小数部分非循环节部分(b)循环节(c)
公式也有了:
a+b/10^(Len(b))+c/((10^(Len(c))-1)*10^(Len(b)))
(Len表示字数统计)
给我数一下括号...啊,对了。
这样一来,循环小数转分数就轻而易举地解决了,其他小数自然也就不在话下。
  1. @echo off
  2. setlocal ENABLEDELAYEDEXPANSION
  3. title 小数转分数&color 60
  4. mode con cols=31 lines=7
  5. set er=goto err
  6. :loop
  7. cls&echo 你可以用,表示循环节
  8. echo 合法的输入格式:
  9. echo,                 .
  10. echo 1.8  .8,3(表示0.83)  5.,285714
  11. set input=&set /p input=请输入:
  12. echo !input!|findstr "^[0-9.,]*$">nul||%er%
  13. if "!input:.=!"=="!input!" ^
  14. for /f "tokens=* delims=0" %%i in ("!input!") do (
  15. set /a tp=%%i+1-1
  16. echo !tp!
  17. pause>nul
  18. goto :loop
  19. )
  20. set tp=!input:*.=!&if not "!tp:.=!"=="!tp!" %er%
  21. if not "!input:,=!"=="!input!" (echo !input:*,=!|findstr "[.,]">nul&&%er%)
  22. echo !input!|findstr "[.,]0*$">nul&&%er%
  23. if "!input:~0,1!"=="." set input=0!input!
  24. set tp=!input:*.=.!
  25. set a=!input:%tp%=!
  26. set b=!input:%a%.=!&set tp=!input:*,=,!
  27. set b=!b:%tp%=!&if "!input:,=!"=="!input!" (set c=) else set c=!tp:,=!
  28. for /f "tokens=* delims=0" %%i in ("!a!") do set /a a=%%i+1-1
  29. call :len "!b!" blength
  30. call :len "!c!" clength
  31. call :string !blength! 0 bnum0
  32. call :string !clength! 9 cnum9
  33. if "!c!"=="" (
  34. set /a "d=!b!"&set e=1!bnum0!
  35. ) else (
  36. set /a "d=(!b!+1-1)*(!cnum9!+1-1)+(!c!+1-1)"&set e=!cnum9!!bnum0!
  37. )
  38. call :gcd !d! !e! decomdiv
  39. set /a d/=!decomdiv!,e/=!decomdiv!
  40. if !a! neq 0 set /p=!a!+<nul
  41. echo !d!/!e!
  42. pause>nul
  43. goto loop
  44. :err
  45. echo cls&echo 非法输入&pause>nul&goto loop
  46. :len
  47. set "string=%~1"
  48. set len=0
  49. if "!string!"=="" set %2=%len%&goto :eof
  50. :len2
  51. if "!string:~%len%,1!"=="" (set %2=%len%&goto :eof) else set /a len+=1&&goto len2
  52. :string
  53. set "%3="&(for /l %%i in (1 1 %1) do set "%3=!%3!%2")&goto :eof
  54. :gcd
  55. set /a tempa=%1,tempb=%2
  56. :gcd2
  57. if !tempa! geq !tempb! (set /a tempa=!tempa!%%!tempb!) else set /a tempb=!tempb!%%!tempa!
  58. if !tempa!==0 set %3=!tempb!&goto :eof
  59. if !tempb!==0 (set %3=!tempa!&goto :eof) else goto gcd2
复制代码
3

评分人数

    • 随风: 不错!PB + 20
    • rat:PB + 30 技术 + 1
    • more: 很不错PB + 30 技术 + 1

这...
可以帮我做数学题!

TOP

回复 5楼 的帖子

逗号表示循环小数中的循环位所在位置
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

不明白你的逗号到底有什么用,到底怎样的输入才是合法的,不过感觉你的代码应该还可以再精简。
技术问题请到论坛发帖求助!

TOP

回复 3楼 的帖子

已修复1.00的错误。
假分数就不必了吧,我们老师都叫我们写带分数的。

TOP

改下下面的代码,一次性生成假分数吧。另外形如1.00的会提示以0为除数的错误。
if !a! neq 0 set /p=!a!+<nul
echo !d!/!e!

TOP

牛,欢迎做成函数形式方便调用~~

TOP

返回列表