VB实现小数和分数的相互转化

原创 2006年06月03日 21:21:00

Function fenshu(ByVal xiaoshu As Single, Optional ByVal jingdu As Integer = 3) As String '小数转换为分数,误差小于0.1^jingdu
Dim i As Long
Do
i = i + 1
Loop Until Abs((i / xiaoshu) - Round((i / xiaoshu), 0)) < 0.1 ^ jingdu
fenshu = i & "/" & Round(i / xiaoshu)
End Function


Function xiaoshu(ByVal fenshu As String) As String '将N/D形式(其中N为分子,D为分母)的分数转换为小数,如果为无限循环小数则用括号将循环节括起来
Dim N As Long, D As Long
N = CLng(Split(fenshu, "/")(0))
D = CLng(Split(fenshu, "/")(1))
If N Mod D = 0 Then '整除
xiaoshu = N / D
Exit Function
Else


Dim digit() As String, flag() As Long, temp As Double, temp2 As Long, i As Long, K As Integer
ReDim digit(1 To D + Len(CStr(D))) '定义最长不重复位数
ReDim flag(D) '0-D 每位数字出现于小数点后的位置
xiaoshu = Int(N / D) & "."

temp = N Mod D '取余

i = 2
Do While i <= D + Len(CStr(D)) '循环所有可能

If temp = 0 Then '除尽了
ReDim Preserve digit(1 To i) '前i位
xiaoshu = xiaoshu & Join(digit, "")
Exit Function
End If


If flag(temp) > 1 Then '重复出现
digit(flag(temp)) = "(" & digit(flag(temp)) 'flag(temp)指该数字第一次出现的位置,添加左括号
ReDim Preserve digit(1 To i - 1)
xiaoshu = xiaoshu & Join(digit, "") & ")" '添加右括号
Exit Function
Else
flag(temp) = i '赋值
End If
'以下三行模拟除法运算,实现高精度除法
temp = temp * 10
digit(i) = Int(temp / D) Mod 10
temp = temp - Int(temp / D) * D

i = i + 1

Loop

End If
End Function

Private Sub Command1_Click()
Dim i As Integer, x() As String

ReDim x(1 To 6) '小数到分数
For i = 1 To 6
x(i) = fenshu(3.14159265358979, i) & "(误差小于1/" & 10 ^ (i - 1) & " )"
Next
MsgBox Join(x, vbCrLf), vbInformation, "圆周率"

ReDim x(1 To 17) '分数到小数
For i = 1 To 17
x(i) = Right(" " & i, 2) & "/17=" & xiaoshu(i & "/17")
Next
MsgBox Join(x, vbCrLf), vbInformation, "17的循环节"
End Sub

分数转小数(模拟)

请写出一个程序,接受一个以N/D(0 一些转化的例子: 1/3=.(3) 22/5=4.4  1/7=.(142857) 3/8=.375  11/59= .(1864406779...
  • hushhw
  • hushhw
  • 2017年10月27日 11:26
  • 82

小数转分数

好久没写过算法方面的代码了,偶然翻开《编程之美》看到了这个题,拿来写写。具体算法在《编程之美》2.6和2.7。#! /usr/bin/python def is_even(x): if 0 ...
  • stormdpzh
  • stormdpzh
  • 2015年05月27日 19:20
  • 560

我的程序(6):分数小数互相转换

# -*- coding: utf-8 -*-#author : wayne   http://blog.csdn.net/wayne92/#email:moonbingbing@gmail.comi...
  • wayne92
  • wayne92
  • 2007年09月14日 18:01
  • 4278

关于小数转化成分数

题目就是小数转化成分式的形式输出 循环小数和非循环小数 循环节用括号说明 思路就是:把小数转化成    小数的数值/(10^k)  例如  0.55 = 55/100 转化之后再进行化简,就是...
  • code_boss
  • code_boss
  • 2018年01月23日 21:38
  • 63

将分数表示为任意进制的小数

最近在翻看一本数学分析教材中关于实数的基本理论的章节,其中对有理数的小数表示方法给出了严密的定义和详细的讨论。看后很有收获,然后突然就想到了这么个问题,如何编个程序将有理数的分数表示转换为小数表示,并...
  • liyuanbhu
  • liyuanbhu
  • 2013年11月19日 13:14
  • 1937

Java 实训3-5 接受用户输入0-100的分数 将其转化为1-5的5分记方法

//test.javaimport java.io.*;class test{ public static void main(String srgs[]) throws Exception {  S...
  • pfboy
  • pfboy
  • 2007年10月07日 14:37
  • 1155

分数与小数的相互转换

小数转化为分数   题目:http://acm.hdu.edu.cn/showproblem.php?pid=1717   题意:把小数转化为分数,循环部分用()表示。 [cpp] vi...
  • waitfor_
  • waitfor_
  • 2013年11月25日 22:27
  • 1589

小数转换分数

小数转换分数          小数转换成分数的时候,是让小数有更精确的表示。这个问题可以分两种情况来解决:有限小数和循环小数。     对于有限小数: 我们可以直接把后面...
  • puqutogether
  • puqutogether
  • 2015年01月29日 10:09
  • 1268

VB数据库编程

SQL功能与特性  其实,在前面的文章中,已经提及SQL命令的一些基本功能,然而,通过SQL命令,程序设计师或数据库管理员(DBA)可以:  (一)建立数据库的表格。(包括设置表格所可以使用之空间) ...
  • selen
  • selen
  • 2006年02月13日 10:15
  • 8774

第三章 VB程序设计语言基础

第三章 VB程序设计语言基础一 VB中的数据与运算二 标准函数三 三种基本结构(顺序,判定,循环)一 VB中的数据与运算3.1.1 数据类型3.1.2 ...
  • pzhan
  • pzhan
  • 2007年02月02日 17:25
  • 3312
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:VB实现小数和分数的相互转化
举报原因:
原因补充:

(最多只允许输入30个字)