欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

如何编写一个小数转换分数的函数?

程序员文章站 2022-05-03 15:33:53
public function xtof(str as currency, optional fenm as i...

public function xtof(str as currency, optional fenm as integer = 32) as string

' 只限于整除分数.
  dim cfm as currency
  dim cfmmod as integer
  on error goto erroreof

  cfm = 1 / fenm
  xtof = ""
  if str = 0 then xtof = "": exit function

  dim point as integer
  dim dint as string
  dim dpoint as currency
  dim fint, fint1, fint2 as integer
  if str <> 0 then
        if str > 1 then
            point = instr(1, str, ".", 1)
            if point = 0 then
                xtof = str:
                exit function
            else
                dint = mid(str, 1, point - 1)
                dpoint = ccur("0." & mid(str, point + 1))
                fint = instr(1, xtof(dpoint), "/", 1)
                fint1 = cint(mid(xtof(dpoint), 1, fint - 1))
                fint2 = cint(mid(xtof(dpoint), fint + 1))

                xtof = cstr(dint * fint2 + fint1) & "/" & cstr(fint2)

            end if
        else
          if fenm mod cint(str / cfm) = 0 then
            xtof = "1/" + cstr(fenm / cint(str / cfm))
          else
              cfmmod = maxgys(fenm, cint(str / cfm))
            xtof = cstr(cint(str / cfm / cfmmod)) + "/" + cstr(cint(fenm / cfmmod))
          end if
        end if
  else
      xtof = "0"
  end if
  exit function
erroreof:
  xtof = ""
end function
function maxgys(num1 as integer, num2 as integer) as integer
    dim minnum, i as integer
    minnum = num1
    if num1 > num2 then minnum = num2
    for i = 1 to minnum
    if ((num1 mod i) = 0) and ((num2 mod i) = 0) then maxgys = i

    next i
end function