如何将无限小数(即.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
Daniel Brück.. 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,等等.因此,尝试只搜索模式并将分母设置为相应的数字.当然,你必须在一些数字之后停下来,因为你永远不会知道这个模式是永久重复还是只重复多次.并且您将在最后一位数字中遇到舍入误差,因此您仍需要一些聪明的逻辑.
由于.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
要显示多个数字(例5/12),只需显示问号数量.