6 个解决方案
#1
用String进行浮点运算,本来调用CPU命令进行的浮点运算就不准确
#2
只能利用字串了
#3
呵呵,看来你指望着定义为DOUBLE什么的都不行了,只能进行位运算。自己写一个函数吧,好像网上有这方面的资料
#4
靠~~
高精度计算也有人问??
到书店找个奥林匹克教材,前几页就讲了,拿个本子抄下来,一切ok
买下来太浪费
高精度计算也有人问??
到书店找个奥林匹克教材,前几页就讲了,拿个本子抄下来,一切ok
买下来太浪费
#5
呵呵,参考下面的:
细嚼慢咽--高精度除法
我们知道,程序设计用的高级语言,数据的精度有单、双精度,最高的计算结果是十进制有效位17位。我在学生程序设计竞赛时,出了一道题目:做诸如355/113的计算,要求的精度是算到出现循环为止。计算机专业的学生学过几种语言,知道355/113要算111位,达不到。有人说题目出错了。不对!程序设计竞赛就要你动脑筋。
其实,这种手算,做竖式的除法,小学生都会算的。问题是计算机如何模拟做竖式除法。动脑筋,其实和做作文一个道理,先要仔细审题。
记不得是哪个伟人讲过:人类在给自己出题目时,已经在题目中包含了解题的思路。出题目,是划定一个问题的域,就是问题的范围。读懂题目,理解题意,是不跑题的前提。作文不能跑题,程序设计也不能跑题。怎么会跑题呢?就是你光去想:用什么语句?这就是你跑题的开始。你要想:普通人,不用计算机,如何去做?把常人对问题的解决办法考虑一遍,寻找出路。把思路滤清。理出头绪来,一步一步是如何进行的。接着,就是要计算机如何去模拟这个过程。
下面,我们就针对小学生手工做竖式除法,讨论一个实例:355/113=?
3.141592... 除法是否继续进行,要看余数和以前的重复没有?
113/355
339
160 第一个余数是16,乘10,再除
113
470 第二个余数是47,乘10,再除
452
180 第三个余数是18,乘10,再除
113
670 第四个余数是67,乘10,再除
565
1050 第五个余数是95,乘10,再除
1017
330 第六个余数是33,乘10,再除
226
1040 第七个余数是104,乘10,再除...
-------------------------------------------------------------
下面,X、Y中已经有被除数、除数;Text1是输出结果的文本框;数组a(800)用来存放各次的余数,
a(m)中的m,从0起,存一个,m=m+1。ys是当前的余数,先和以往的余数从a(0)比较到a(m),如果相等,
就不再除下去了;如果比较以往所有的余数,都不相等,m=m+1,这个余数保存进a(m),回头(back)再做。
Private Sub Command2_Click() 点击这里,运行程序。
Text1.Text = Int(x / y) & "."
a(0) = x Mod y: ys = a(0): m = 0
back:
ys = ys * 10: s = Int(ys / y): ys = ys Mod y
v = Str(s): v = Right(v, 1) '商在s是个数值,要把数值化为数字,还要把前面的空格去掉,成v
Text1.Text = Text1.Text + v '单个数字的商,才可以逐个拼接到文本框中去。
For i = 0 To m
If ys = a(i) Then
GoTo there
End If
Next i
m = m + 1: a(m) = ys: GoTo back
there: '这里是不再除下去时,把小数位数,向窗体用Print方法输出
Cls
Print "小数"; m; "位后出现循环"
Print x; "/"; y; "=" '再在文本框上,把除法的两个值相除等于标记上去。
End Sub
上下对照,看明白没有?你要学会抽象思维。上面的算法,能不能不写出来,要学会在脑子里想!
此外,还希望你能够悟到些程序设计的思路。比如,余数比较,比第一个时,就要用比较全部的循环。凡事要想远一点,全面一点!
当然,VB的程序设计,开头要做界面窗体的控件设计,决定用什么控件、又用什么事件去驱动它。要按问题的需要来考虑、要让使用者方便来选择。这里,Command1用来‘设定’两个数,Command2用来开始‘计算’。程序设计,经典的思想,还是过程代码的编写。
我们的注意力还是放到程序设计的过程代码编写上吧。
细嚼慢咽--高精度除法
我们知道,程序设计用的高级语言,数据的精度有单、双精度,最高的计算结果是十进制有效位17位。我在学生程序设计竞赛时,出了一道题目:做诸如355/113的计算,要求的精度是算到出现循环为止。计算机专业的学生学过几种语言,知道355/113要算111位,达不到。有人说题目出错了。不对!程序设计竞赛就要你动脑筋。
其实,这种手算,做竖式的除法,小学生都会算的。问题是计算机如何模拟做竖式除法。动脑筋,其实和做作文一个道理,先要仔细审题。
记不得是哪个伟人讲过:人类在给自己出题目时,已经在题目中包含了解题的思路。出题目,是划定一个问题的域,就是问题的范围。读懂题目,理解题意,是不跑题的前提。作文不能跑题,程序设计也不能跑题。怎么会跑题呢?就是你光去想:用什么语句?这就是你跑题的开始。你要想:普通人,不用计算机,如何去做?把常人对问题的解决办法考虑一遍,寻找出路。把思路滤清。理出头绪来,一步一步是如何进行的。接着,就是要计算机如何去模拟这个过程。
下面,我们就针对小学生手工做竖式除法,讨论一个实例:355/113=?
3.141592... 除法是否继续进行,要看余数和以前的重复没有?
113/355
339
160 第一个余数是16,乘10,再除
113
470 第二个余数是47,乘10,再除
452
180 第三个余数是18,乘10,再除
113
670 第四个余数是67,乘10,再除
565
1050 第五个余数是95,乘10,再除
1017
330 第六个余数是33,乘10,再除
226
1040 第七个余数是104,乘10,再除...
-------------------------------------------------------------
下面,X、Y中已经有被除数、除数;Text1是输出结果的文本框;数组a(800)用来存放各次的余数,
a(m)中的m,从0起,存一个,m=m+1。ys是当前的余数,先和以往的余数从a(0)比较到a(m),如果相等,
就不再除下去了;如果比较以往所有的余数,都不相等,m=m+1,这个余数保存进a(m),回头(back)再做。
Private Sub Command2_Click() 点击这里,运行程序。
Text1.Text = Int(x / y) & "."
a(0) = x Mod y: ys = a(0): m = 0
back:
ys = ys * 10: s = Int(ys / y): ys = ys Mod y
v = Str(s): v = Right(v, 1) '商在s是个数值,要把数值化为数字,还要把前面的空格去掉,成v
Text1.Text = Text1.Text + v '单个数字的商,才可以逐个拼接到文本框中去。
For i = 0 To m
If ys = a(i) Then
GoTo there
End If
Next i
m = m + 1: a(m) = ys: GoTo back
there: '这里是不再除下去时,把小数位数,向窗体用Print方法输出
Cls
Print "小数"; m; "位后出现循环"
Print x; "/"; y; "=" '再在文本框上,把除法的两个值相除等于标记上去。
End Sub
上下对照,看明白没有?你要学会抽象思维。上面的算法,能不能不写出来,要学会在脑子里想!
此外,还希望你能够悟到些程序设计的思路。比如,余数比较,比第一个时,就要用比较全部的循环。凡事要想远一点,全面一点!
当然,VB的程序设计,开头要做界面窗体的控件设计,决定用什么控件、又用什么事件去驱动它。要按问题的需要来考虑、要让使用者方便来选择。这里,Command1用来‘设定’两个数,Command2用来开始‘计算’。程序设计,经典的思想,还是过程代码的编写。
我们的注意力还是放到程序设计的过程代码编写上吧。
#6
~|~
#1
用String进行浮点运算,本来调用CPU命令进行的浮点运算就不准确
#2
只能利用字串了
#3
呵呵,看来你指望着定义为DOUBLE什么的都不行了,只能进行位运算。自己写一个函数吧,好像网上有这方面的资料
#4
靠~~
高精度计算也有人问??
到书店找个奥林匹克教材,前几页就讲了,拿个本子抄下来,一切ok
买下来太浪费
高精度计算也有人问??
到书店找个奥林匹克教材,前几页就讲了,拿个本子抄下来,一切ok
买下来太浪费
#5
呵呵,参考下面的:
细嚼慢咽--高精度除法
我们知道,程序设计用的高级语言,数据的精度有单、双精度,最高的计算结果是十进制有效位17位。我在学生程序设计竞赛时,出了一道题目:做诸如355/113的计算,要求的精度是算到出现循环为止。计算机专业的学生学过几种语言,知道355/113要算111位,达不到。有人说题目出错了。不对!程序设计竞赛就要你动脑筋。
其实,这种手算,做竖式的除法,小学生都会算的。问题是计算机如何模拟做竖式除法。动脑筋,其实和做作文一个道理,先要仔细审题。
记不得是哪个伟人讲过:人类在给自己出题目时,已经在题目中包含了解题的思路。出题目,是划定一个问题的域,就是问题的范围。读懂题目,理解题意,是不跑题的前提。作文不能跑题,程序设计也不能跑题。怎么会跑题呢?就是你光去想:用什么语句?这就是你跑题的开始。你要想:普通人,不用计算机,如何去做?把常人对问题的解决办法考虑一遍,寻找出路。把思路滤清。理出头绪来,一步一步是如何进行的。接着,就是要计算机如何去模拟这个过程。
下面,我们就针对小学生手工做竖式除法,讨论一个实例:355/113=?
3.141592... 除法是否继续进行,要看余数和以前的重复没有?
113/355
339
160 第一个余数是16,乘10,再除
113
470 第二个余数是47,乘10,再除
452
180 第三个余数是18,乘10,再除
113
670 第四个余数是67,乘10,再除
565
1050 第五个余数是95,乘10,再除
1017
330 第六个余数是33,乘10,再除
226
1040 第七个余数是104,乘10,再除...
-------------------------------------------------------------
下面,X、Y中已经有被除数、除数;Text1是输出结果的文本框;数组a(800)用来存放各次的余数,
a(m)中的m,从0起,存一个,m=m+1。ys是当前的余数,先和以往的余数从a(0)比较到a(m),如果相等,
就不再除下去了;如果比较以往所有的余数,都不相等,m=m+1,这个余数保存进a(m),回头(back)再做。
Private Sub Command2_Click() 点击这里,运行程序。
Text1.Text = Int(x / y) & "."
a(0) = x Mod y: ys = a(0): m = 0
back:
ys = ys * 10: s = Int(ys / y): ys = ys Mod y
v = Str(s): v = Right(v, 1) '商在s是个数值,要把数值化为数字,还要把前面的空格去掉,成v
Text1.Text = Text1.Text + v '单个数字的商,才可以逐个拼接到文本框中去。
For i = 0 To m
If ys = a(i) Then
GoTo there
End If
Next i
m = m + 1: a(m) = ys: GoTo back
there: '这里是不再除下去时,把小数位数,向窗体用Print方法输出
Cls
Print "小数"; m; "位后出现循环"
Print x; "/"; y; "=" '再在文本框上,把除法的两个值相除等于标记上去。
End Sub
上下对照,看明白没有?你要学会抽象思维。上面的算法,能不能不写出来,要学会在脑子里想!
此外,还希望你能够悟到些程序设计的思路。比如,余数比较,比第一个时,就要用比较全部的循环。凡事要想远一点,全面一点!
当然,VB的程序设计,开头要做界面窗体的控件设计,决定用什么控件、又用什么事件去驱动它。要按问题的需要来考虑、要让使用者方便来选择。这里,Command1用来‘设定’两个数,Command2用来开始‘计算’。程序设计,经典的思想,还是过程代码的编写。
我们的注意力还是放到程序设计的过程代码编写上吧。
细嚼慢咽--高精度除法
我们知道,程序设计用的高级语言,数据的精度有单、双精度,最高的计算结果是十进制有效位17位。我在学生程序设计竞赛时,出了一道题目:做诸如355/113的计算,要求的精度是算到出现循环为止。计算机专业的学生学过几种语言,知道355/113要算111位,达不到。有人说题目出错了。不对!程序设计竞赛就要你动脑筋。
其实,这种手算,做竖式的除法,小学生都会算的。问题是计算机如何模拟做竖式除法。动脑筋,其实和做作文一个道理,先要仔细审题。
记不得是哪个伟人讲过:人类在给自己出题目时,已经在题目中包含了解题的思路。出题目,是划定一个问题的域,就是问题的范围。读懂题目,理解题意,是不跑题的前提。作文不能跑题,程序设计也不能跑题。怎么会跑题呢?就是你光去想:用什么语句?这就是你跑题的开始。你要想:普通人,不用计算机,如何去做?把常人对问题的解决办法考虑一遍,寻找出路。把思路滤清。理出头绪来,一步一步是如何进行的。接着,就是要计算机如何去模拟这个过程。
下面,我们就针对小学生手工做竖式除法,讨论一个实例:355/113=?
3.141592... 除法是否继续进行,要看余数和以前的重复没有?
113/355
339
160 第一个余数是16,乘10,再除
113
470 第二个余数是47,乘10,再除
452
180 第三个余数是18,乘10,再除
113
670 第四个余数是67,乘10,再除
565
1050 第五个余数是95,乘10,再除
1017
330 第六个余数是33,乘10,再除
226
1040 第七个余数是104,乘10,再除...
-------------------------------------------------------------
下面,X、Y中已经有被除数、除数;Text1是输出结果的文本框;数组a(800)用来存放各次的余数,
a(m)中的m,从0起,存一个,m=m+1。ys是当前的余数,先和以往的余数从a(0)比较到a(m),如果相等,
就不再除下去了;如果比较以往所有的余数,都不相等,m=m+1,这个余数保存进a(m),回头(back)再做。
Private Sub Command2_Click() 点击这里,运行程序。
Text1.Text = Int(x / y) & "."
a(0) = x Mod y: ys = a(0): m = 0
back:
ys = ys * 10: s = Int(ys / y): ys = ys Mod y
v = Str(s): v = Right(v, 1) '商在s是个数值,要把数值化为数字,还要把前面的空格去掉,成v
Text1.Text = Text1.Text + v '单个数字的商,才可以逐个拼接到文本框中去。
For i = 0 To m
If ys = a(i) Then
GoTo there
End If
Next i
m = m + 1: a(m) = ys: GoTo back
there: '这里是不再除下去时,把小数位数,向窗体用Print方法输出
Cls
Print "小数"; m; "位后出现循环"
Print x; "/"; y; "=" '再在文本框上,把除法的两个值相除等于标记上去。
End Sub
上下对照,看明白没有?你要学会抽象思维。上面的算法,能不能不写出来,要学会在脑子里想!
此外,还希望你能够悟到些程序设计的思路。比如,余数比较,比第一个时,就要用比较全部的循环。凡事要想远一点,全面一点!
当然,VB的程序设计,开头要做界面窗体的控件设计,决定用什么控件、又用什么事件去驱动它。要按问题的需要来考虑、要让使用者方便来选择。这里,Command1用来‘设定’两个数,Command2用来开始‘计算’。程序设计,经典的思想,还是过程代码的编写。
我们的注意力还是放到程序设计的过程代码编写上吧。
#6
~|~