把小数sngX变为分数,以string形式给出。digit表示最后输出的分数的分母的位数。在立即窗口的测试结果如下:
?SngToFricStr(500.33, 1)
500又1/3
?SngToFricStr(-500.4, 1)
-500又2/5
核心算法是加黑加下划线那一行,来自http://topic.csdn.net/t/20051024/13/4346248.html 13楼。
- Function SngToFricStr(byVal sngX As Single, Optional digit As Integer = 1) As String
- Dim i As Integer
- Dim strDen As String 'denominator
- Dim strNom As String 'nominator
- Dim strInt As String 'integer part,记录整数部分
- Dim intX As Integer '对sngX取整后的部分
- intX = Fix(sngX)
- '如果有整数部分,则记下来; 没有整数部分就不记了,省得最后头上多个0
- If intX <> 0 Then strInt = intX
- '取小数
- sngX = sngX - intX
- '如果是负的,而且有整数部分,就取正,省得最后像这样-5.4:”-5-2/5“
- If (sngX < 0) And (intX <> 0) Then sngX = -sngX
- If sngX = 0 Then
- SngToFricStr = strInt
- Exit Function
- End If
- i = 1
- While Abs((i / sngX) - Round((i / sngX), 0)) > 10 ^ (-digit)
- i = i + 1
- Wend
- '分子
- strNom = i
- If sngX < 0 Then strNom = "-" & strNom
- '分母
- If sngX >= 0 Then
- strDen = "/" & Round(i / sngX)
- Else
- strDen = "/" & Round(i / (-sngX))
- End If
- If strDen = "/1" Then strDen = ""
- '整数部分
- If strInt <> "" Then strInt = strInt & "又"
- SngToFricStr = strInt & strNom & strDen
- End Function