ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 3486|回复: 21

[求助] 判断小数的循环位置 顺祝大家十一快乐

[复制链接]

TA的精华主题

TA的得分主题

发表于 2019-10-3 05:35 | 显示全部楼层 |阅读模式
QQ截图20191003051707.png
如果分数是可整除小数,则判断为“整除”,如果是循环小数,且循环小数的循环位置是从小数点后第一位开始,则判断为“首位循环”,如果循环的起始位置为小数点后第二位,则判断为"次位循环",如果循环的起始位置为小数点后第三位,则判断为"末位循环",(只判断这几种情况即可)将判断结果显示在E20:G20以及E25:G25处。

字体背景设置:整除设置为红底黄字,首位循环设置为灰底黄字,次位循环设置成粉底黄字,末位循环设置为茶底黑字。

解释说明
分数A为1.625,是可整除小数,判断为"整除"。
分数B为1.916666666,循环位置是从小数点后第三位开始的,所以判断为"末位循环"。
分数C为1.6363636363,循环位置是从小数点后第一位开始的,所以判断为"首位循环"。
分数D为1.6111111111,循环位置是从小数点后第二位开始的,所以判断为"次位循环"。
分数E为1.34482758620689655172413793103448275862068965517241379310,循环位置是从小数点后第一位开始,所以判断为"首位循环"。
分数F为1.571428571428571428,循环位置是从小数点后第一位开始,所以判断为"首位循环"。

附件
判断小数循环位置.rar (2.6 KB, 下载次数: 3)


TA的精华主题

TA的得分主题

发表于 2019-10-3 13:42 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2019-10-3 14:03 | 显示全部楼层
有个思路,取一定长度的小数位(例如100位),对里面包含的数字进行字典记录个数,以最小个数为基准,所有数字的个数对基数进行对比,看看是不是一个整数倍数,假如不是,从第一位小数的数字开始进行剔除个数,直到能达成条件或者全部对完了

TA的精华主题

TA的得分主题

发表于 2019-10-4 04:06 来自手机 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-10-4 13:33 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2019-10-4 15:23 | 显示全部楼层
本帖最后由 时间的音符 于 2019-10-4 15:31 编辑

  1. Public Sub main()
  2.     Dim nums As New Collection
  3.     Set dict = CreateObject("Scripting.dictionary")
  4.     '输入的数据 m为分子  n为分母
  5.     m = 1: n = 7
  6.     '整数位
  7.     intval = Int(m / n)
  8.     m = (m Mod n) * 10
  9.     Do While Not dict.Exists(m)
  10.         If m < n Then
  11.             nums.Add 0
  12.             dict.Add m, nums.Count
  13.             m = m * 10
  14.         Else
  15.             nums.Add Int(m / n)
  16.             dict.Add m, nums.Count
  17.             m = (m Mod n) * 10
  18.         End If
  19.     Loop
  20.     '循环表示
  21.     s = ""
  22.     For i = 1 To nums.Count
  23.         s = IIf(i = dict(m), s & "(" & nums(i), s & nums(i))
  24.     Next
  25.     s = intval & "." & s & ")"
  26.     MsgBox s
  27. End Sub

复制代码

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2019-10-4 15:37 | 显示全部楼层
另外附注一下
对于 1/n 来说   循环节的长度是<n的 可能达到n-1
你可以试试 1/1999  答案很惊人.

TA的精华主题

TA的得分主题

发表于 2019-10-4 16:03 | 显示全部楼层
本帖最后由 时间的音符 于 2019-10-4 16:05 编辑

发现一个正好循环节长度=n-1的例子
1/1777 窗体显示不下
令[a1] = s
可以发现len(a1)-4 = 1776
ps:4表示减掉整数长度+"."+两个括号

TA的精华主题

TA的得分主题

发表于 2019-10-4 17:49 | 显示全部楼层
这个试下,感觉因为除数不变,只要循环里出现的被除数曾经出现过,那么应该后面就会出现重现前面得到的结果,也就是出现了循环的情况
  1. Function myDiv(ByVal fD1 As Long, ByVal fD2 As Long) As String
  2. Dim Dic As Object, T#, N&, C&
  3. T = fD1 Mod fD2
  4. If T = 0 Then
  5.     myDiv = "整除"
  6.     GoTo Skip
  7. End If
  8. Set Dic = CreateObject("scripting.dictionary")
  9. C = 1
  10. Dic(T) = 1
  11. For N = 0 To fD2
  12.     C = C + 1
  13.     T = T * 10
  14.     T = T Mod fD2
  15.     If T = 0 Then
  16.         myDiv = "整除"
  17.         GoTo Skip
  18.     Else
  19.         If Dic.exists(T) Then
  20.             myDiv = Choose(Dic(T), "首", "次", "末") & "位循环"
  21.             GoTo Skip
  22.         Else
  23.             Dic(T) = C
  24.         End If
  25.     End If
  26. Next N
  27. myDiv = "无限不循环"
  28. Skip:
  29. Set Dic = Nothing
  30. Application.Volatile
  31. End Function
复制代码
我没办法用PI来测试

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2019-10-4 18:33 | 显示全部楼层
当分子、分母互质时,可通过对分母的质因数分析,得到各种结果。
分母8,等于2^3,不包含2、5以外的其它质因数,所以分数A可化为有限小数,即“整除”(不是严谨的概念)。
分母12,等于2^2*3,包含了2个因数2,分数B可化为分母是900的分数(混循环,循环节有1位,从第3位开始循环),按规则,分类为“末位循环”。
分母11,是99的约数,分数C可化为纯循环小数,按规则,分类为“首位循环”。
分母18,等于2*3^3,包含了1个因数2,分数D可化为分母是90的分数(混循环,循环节有1位,从第2位开始循环),按规则,分类为“次位循环”。

评分

1

查看全部评分

您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关闭

最新热点上一条 /1 下一条

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-4-24 23:21 , Processed in 0.036853 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

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