编辑
根据您的说明和评论,似乎您想要的是所有数字(不包括小数点)的数字根。换句话说,反复求和直到得到一个单独的数字。
这可以通过比加总数字更简单的公式来计算。
=1+(SUBSTITUTE(B5,".","")-1)-(INT((SUBSTITUTE(B5,".","")-1)/9)*9)
对于较长的数字,我们可以将其分成两部分并分别处理。例如:
=1+MOD(1+MOD(LEFT(SUBSTITUTE(B5,".",""),INT(LEN(SUBSTITUTE(B5,".",""))/2))-1,9)+1+MOD(RIGHT(SUBSTITUTE(B5,".",""),LEN(SUBSTITUTE(B5,".",""))-INT(LEN(SUBSTITUTE(B5,".",""))/2))-1,9)-1,9)
然而,数字应该存储为文本。当数字以数字形式存储时,我们看到的可能并不是实际存储的内容以及公式(还有UDF)将要处理的内容。
长公式版本将更正电子表格上除B104之外的所有错误。B104似乎具有值5226.9332653096000,但Excel实际上存储值为5226.9333265309688。由于Excel的精度限制,这将被处理为5226.93332653097。因此会出现不一致现象。
另一种可能有效的方法是将列B中的所有结果舍入到15位数字(例如:)。结合使用长公式版本,应该可以得到您显示的所有值的一致性。
解释:
- 如果一个数字可被9整除,它的数字根将为9,否则数字根将为n MOD 9
- 通用公式为=1+Mod(n-1,9)
- 在您的情况下,由于我们正在处理超过使用MOD函数计算的数字的数字,我们需要删除点,并使用等价于mod的内容,即n-(int(n/9)*9)
- 注意:
- 这将最好与存储为文本的数字一起使用。由于Excel可能会以不同于预期的方式显示和/或转换大型数字或具有许多小数位的数字,因此使用数字的文本串是最稳定的方法。
- 此方法对超过15位的数字不可靠。
如果您有超过15位的数字,则建议使用VBA用户定义函数:
Option Explicit
Function digitalRoot(num As String) As Long
Dim S As String, Sum As Long, I As Long
S = num
Do While Len(S) > 1
Sum = 0
For I = 1 To Len(S)
Sum = Sum + Val(Mid(S, I, 1))
Next I
S = Trim(Str(Sum))
Loop
digitalRoot = CLng(S)
End Function