以文本方式查看主题 - Foxtable(狐表) (http://foxtable.net/bbs/index.asp) -- 专家坐堂 (http://foxtable.net/bbs/list.asp?boardid=2) ---- 如何用分数形式显示计算结果 (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=24094) |
-- 作者:明丰 -- 发布时间:2012/9/29 15:09:00 -- 如何用分数形式显示计算结果 output.show(Fract(eval(1-999/7999)))
上面的结果为:7/8,而不是7000/7999。
请问能精确显示吗? |
-- 作者:lin_hailun -- 发布时间:2012/9/29 15:23:00 -- 不可能精确显示,电脑不会运算分数,除非自己编程实现。 说说你要的需求,然后根据需求帮你弄弄。 |
-- 作者:明丰 -- 发布时间:2012/9/29 15:35:00 -- 初中学生的作业中有很多含分数的算式,家长每晚要检查签名,如果每道题都核算一遍,头都大了。希望在软件中输入含分数算式,结果用分式表示。 由于电脑计算时以小数形式进行计算,最后转换为分数,所以结果出现误差,上面的要求感觉很难实现。 |
-- 作者:mr725 -- 发布时间:2012/9/29 16:24:00 -- 想办法弄成这样:output.show((7999-999) & "/" & 7999) |
-- 作者:lin_hailun -- 发布时间: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编辑过]
|
-- 作者:程兴刚 -- 发布时间:2012/9/29 20:38:00 -- 用得着那么复杂吗?
Dim s As String = "355/555" |
-- 作者:程兴刚 -- 发布时间:2012/9/29 21:11:00 -- 哦,我看错了楼主的意思,以为仅仅是约分呢!按照楼主的要求出现1-这样的情况,这样即可,同时实现自动约分:
Dim s As String = "1-999/7999"
|
-- 作者:明丰 -- 发布时间:2012/9/29 23:15:00 -- 祝各位中秋节快乐!辛苦了。
如果给定的算式是含分数、整数、连除的混合运算,这个设置还是比较复杂,学习中。 |
-- 作者:程兴刚 -- 发布时间:2012/9/29 23:51:00 -- 复杂在于分解公式,其他的并不可怕,您可以将不同的复杂公式贴出来,让大家在摸索中寻找规律! |
-- 作者:明丰 -- 发布时间: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 |