Foxtable(狐表)用户栏目专家坐堂 → 如何用分数形式显示计算结果


  共有10840人关注过本帖树形打印复制链接

主题:如何用分数形式显示计算结果

帅哥哟,离线,有人找我吗?
明丰
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:二尾狐 帖子:558 积分:4352 威望:0 精华:2 注册:2011/4/18 8:27:00
如何用分数形式显示计算结果  发帖心情 Post By:2012/9/29 15:09:00 [只看该作者]

output.show(Fract(eval(1-999/7999)))

 

上面的结果为:7/8,而不是7000/7999。

 

请问能精确显示吗?


 回到顶部
帅哥哟,离线,有人找我吗?
lin_hailun
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:狐神 帖子:6708 积分:34304 威望:0 精华:11 注册:2012/8/18 23:10:00
  发帖心情 Post By:2012/9/29 15:23:00 [只看该作者]

 不可能精确显示,电脑不会运算分数,除非自己编程实现。

 说说你要的需求,然后根据需求帮你弄弄。

 回到顶部
帅哥哟,离线,有人找我吗?
明丰
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:二尾狐 帖子:558 积分:4352 威望:0 精华:2 注册:2011/4/18 8:27:00
  发帖心情 Post By:2012/9/29 15:35:00 [只看该作者]

初中学生的作业中有很多含分数的算式,家长每晚要检查签名,如果每道题都核算一遍,头都大了。希望在软件中输入含分数算式,结果用分式表示。

由于电脑计算时以小数形式进行计算,最后转换为分数,所以结果出现误差,上面的要求感觉很难实现。


 回到顶部
帅哥哟,离线,有人找我吗?
mr725
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 一级勋章
等级:MVP荣誉狐 帖子:5154 积分:31434 威望:0 精华:8 注册:2008/9/8 12:27:00
  发帖心情 Post By:2012/9/29 16:24:00 [只看该作者]

想办法弄成这样:output.show((7999-999) & "/" & 7999)

 回到顶部
帅哥哟,离线,有人找我吗?
lin_hailun
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:狐神 帖子:6708 积分:34304 威望:0 精华:11 注册:2012/8/18 23:10:00
  发帖心情 Post By:2012/9/29 18:00:00 [只看该作者]

 下面的代码,只支持一个分数的加减操作。

 如果要实现楼主想要的分数计算,就必须自己去实现eval()函数,对表达式进行提取,分析,运算。比较麻烦......涉及递归,操作符比较。

 也就是说,让电脑按照人的顺序去运算,很费精力……楼主请高手帮忙哈。

Dim data As String = "10/5+(5-2/10)+4"
Dim catchs As New System.Text.RegularExpressions.Regex("[\+\-\*/\(\)]*\d+")
Dim mc As System.Text.RegularExpressions.MatchCollection = catchs.Matches(data)
Dim maxfm As Double = 1
Dim nums(mc.count - 1) As String
Dim fzs(mc.count - 1) As String

catchs = New System.Text.RegularExpressions.Regex("^[\+\-\*/\(]+")
Dim mc0 As System.Text.RegularExpressions.MatchCollection = catchs.Matches(mc(0).Value)
If mc0.Count = 0 Then
    nums(0) = "+" & mc(0).Value
Else
    nums(0) = mc(0).Value
End If
Dim m, n, r As Double
For i As Integer = 1 To mc.Count - 1
    nums(i) = mc(i).Value
    If nums(i).IndexOf("/") <> -1 Then
        catchs = New System.Text.RegularExpressions.Regex("\d+")
        Dim mc2 As System.Text.RegularExpressions.MatchCollection = catchs.Matches(nums(i))
        Dim right As Integer = mc2(0).Value
        '求最小公倍数
        If right > maxfm Then
            m = right
            n = maxfm
        Else
            m = maxfm
            n = right
        End If
        Do
            r = m Mod n
            If r = 0 Then Exit Do
            m = n
            n = r
        Loop
        maxfm = maxfm * right / n    
    End If
Next
Dim Index As Integer = 0
For i As Integer = 0 To nums.Length - 1
    catchs = New System.Text.RegularExpressions.Regex("[^\d]+")
    Dim mc2 As System.Text.RegularExpressions.MatchCollection = catchs.Matches(nums(i))
    Dim left As String = mc2(0).Value
    catchs = New System.Text.RegularExpressions.Regex("\d+")
    Dim mc3 As System.Text.RegularExpressions.MatchCollection = catchs.Matches(nums(i))
    Dim right As Integer = mc3(0).Value  
    If nums(i).IndexOf("/") = -1 Then   '如果不是分母
        fzs(Index) = left & right * maxfm
        Index = Index + 1
    Else
        catchs = New System.Text.RegularExpressions.Regex("[^\d]+")
        Dim mc4 As System.Text.RegularExpressions.MatchCollection = catchs.Matches(fzs(Index - 1))
        Dim last_left As String = mc4(0).Value
        catchs = New System.Text.RegularExpressions.Regex("\d+")
        Dim mc5 As System.Text.RegularExpressions.MatchCollection = catchs.Matches(fzs(Index - 1))
        Dim last_right As Double = mc5(0).Value
        fzs(Index - 1) = last_left & last_right / right
    End If
Next

Dim fz As String = ""
For i As Integer = 0 To fzs.Length - 1
    fz = fz & fzs(i)
Next
Dim num As String = ""
For i As Integer = 0 To nums.Length - 1
    num = num & nums(i)
Next
fz = fz & data.SubString(num.Length - 1)
fz = eval(fz)

'约分
If fz > maxfm Then
    m = fz
    n = maxfm
Else
    m = maxfm
    n = fz
End If
Do
    r = m Mod n
    If r = 0 Then Exit Do
    m = n
    n = r
Loop
fz = fz / n
Dim fm As Integer = maxfm / n
Dim result As String = fz & "/" & fm
Output.Show(result)
[此贴子已经被作者于2012-9-30 19:38:04编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
程兴刚
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 一级勋章
等级:超级版主 帖子:7258 积分:40773 威望:0 精华:16 注册:2008/8/31 23:23:00
  发帖心情 Post By:2012/9/29 20:38:00 [只看该作者]

用得着那么复杂吗?

 

Dim s As String = "355/555"
Dim a As Integer = s.split("/")(0) '分子数
Dim b As Integer = s.split("/")(1)  '分母数
Dim c As Integer =  Math.Min(a,b)
If a > 1 And b > 1
    For i As Integer = c To 2 Step -1
        If b Mod i = 0 And a Mod i = 0
            Output.show(a/i & "/" & b/i )
            Exit For
        End If
        If i = 2
            Output.show(a & "/" & b)
        End If
    Next
End If


 回到顶部
帅哥哟,离线,有人找我吗?
程兴刚
  7楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 一级勋章
等级:超级版主 帖子:7258 积分:40773 威望:0 精华:16 注册:2008/8/31 23:23:00
  发帖心情 Post By:2012/9/29 21:11:00 [只看该作者]

哦,我看错了楼主的意思,以为仅仅是约分呢!按照楼主的要求出现1-这样的情况,这样即可,同时实现自动约分:

 

Dim s As String = "1-999/7999"
Dim s1 As String
Dim a As Integer = s.split("/")(1) - s.split("/")(0).split("-")(1)
Dim b As Integer = s.split("/")(1)  '分母数
Dim c As Integer =  Math.Min(a,b)
If a > b
    s = a \ b & "-"
Else
    s = Nothing
End If
If a > 1 And b > 1
    For i As Integer = c To 2 Step -1
        If b Mod i = 0 And a Mod i = 0
            Output.show(s & a/i & "/" & b/i )
            Exit For
        End If
        If i = 2
            Output.show(a & "/" & b)
        End If
    Next
End If

 

 


 回到顶部
帅哥哟,离线,有人找我吗?
明丰
  8楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:二尾狐 帖子:558 积分:4352 威望:0 精华:2 注册:2011/4/18 8:27:00
  发帖心情 Post By:2012/9/29 23:15:00 [只看该作者]

祝各位中秋节快乐!辛苦了。

 

如果给定的算式是含分数、整数、连除的混合运算,这个设置还是比较复杂,学习中。


 回到顶部
帅哥哟,离线,有人找我吗?
程兴刚
  9楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 一级勋章
等级:超级版主 帖子:7258 积分:40773 威望:0 精华:16 注册:2008/8/31 23:23:00
  发帖心情 Post By:2012/9/29 23:51:00 [只看该作者]

复杂在于分解公式,其他的并不可怕,您可以将不同的复杂公式贴出来,让大家在摸索中寻找规律!


 回到顶部
帅哥哟,离线,有人找我吗?
明丰
  10楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:二尾狐 帖子:558 积分:4352 威望:0 精华:2 注册:2011/4/18 8:27:00
  发帖心情 Post By:2012/9/30 7:00:00 [只看该作者]

综合测试题:-4*25/2/5/10*(-1)*1-1/600+5*5*5/125*(1/5+(-1/5))+1/600-41/7999-(-41/7999)-999/7999

 回到顶部
总数 14 1 2 下一页