8 vba
如何将无限小数(即.333333333 ...)转换为字符串分数表示(即"1/3").我正在使用VBA,以下是我使用的代码(我在"b = a Mod b"行遇到溢出错误:
Function GetFraction(ByVal Num As Double) As String
If Num = 0# Then
GetFraction = "None"
Else
Dim WholeNumber As Integer
Dim DecimalNumber As Double
Dim Numerator As Double
Dim Denomenator As Double
Dim a, b, t As Double
WholeNumber = Fix(Num)
DecimalNumber = Num - Fix(Num)
Numerator = DecimalNumber * 10 ^ (Len(CStr(DecimalNumber)) - 2)
Denomenator = 10 ^ (Len(CStr(DecimalNumber)) - 2)
If Numerator = 0 Then
GetFraction = WholeNumber
Else
a = Numerator
b = Denomenator
t = 0
While b <> 0
t = b
b = a Mod b
a = t
Wend
If WholeNumber = 0 Then
GetFraction = CStr(Numerator / a) & "/" & CStr(Denomenator / a)
Else
GetFraction = CStr(WholeNumber) & " " & CStr(Numerator / a) & "/" & CStr(Denomenator / a)
End If
End If
End If
End Function
Run Code Online (Sandbox Code Playgroud)
Dan*_*ner 18
由于.333333333不是1/3,如果不添加一些聪明的"非舍入"逻辑,你将永远不会获得1/3,而是333333333/1000000000.
这是一个处理数字的解决方案,我记得从学校开始有周期性的小数表示.
数字为0. abcd abcd ...等于abcd/9999.所以0. 2357 2357 ......完全等于2357/9999.因为你的模式很长,所以要花很多9个.0 1 1111 ...等于1/9,0.12 1212 ...等于12/99,等等.因此,尝试只搜索模式并将分母设置为相应的数字.当然,你必须在一些数字之后停下来,因为你永远不会知道这个模式是永久重复还是只重复多次.并且您将在最后一位数字中遇到舍入误差,因此您仍需要一些聪明的逻辑.
这仅适用于Excel-VBA,但由于您将其标记为"VBA",我会建议它.Excel具有自定义"分数"格式,您可以通过"格式化单元格"(或者如果您愿意,可以使用ctrl-1)访问该格式.此特定数字格式是Excel特定的,因此不适用于VBA.Format函数.但它确实适用于Excel Formula TEXT().(这是与VBA.Format等效的Excel.这可以像So一样访问:
Sub Example()
MsgBox Excel.WorksheetFunction.Text(.3333,"# ?/?")
End Sub
Run Code Online (Sandbox Code Playgroud)
要显示多个数字(例5/12),只需显示问号数量.