刚在CNOUG看到有人提问如何用PL/SQL 实现小数转分数的问题,下面这段代码是我的实现,主要思路是将输入的整数及小数都分别取出,然后将小数写成以10的n次方的分数,再求其最大公约数,得到简化的分数,最后将整数及分数合并。代码里有一些处理细节,如负数处理,纯整数处理,纯小数处理等等。
create or replace function dftof(iStr number) return varchar2 as
--小数转分数
-- (decimal fraction) to fraction
--设计人:叶正盛
v_Str   varchar(50);
result  varchar(50);
v_fh    varchar(1); --负数符号
v_zs    varchar2(20); --整数
v_xs    varchar2(20); --小数
v_pos   int; --小数点位置
v_fm    integer; --分母
v_fz    integer; --分子
v_zdgys integer; --最大公约数
--求最大公约数
function getZDGYS(iNum1 integer, iNum2 integer) return integer as
v_ys   integer; --余数
v_num1 integer;
v_num2 integer;
begin
v_num1 := iNum1;
v_num2 := iNum2;
v_ys   := mod(v_num1, v_num2);
--辗转相除法
while v_ys <> 0 loop
v_num1 := v_num2;
v_num2 := v_ys;
v_ys   := mod(v_num1, v_num2);
end loop;
return v_num2;
end;
begin
v_Str := trim(iStr);
v_pos := instr(v_Str, '.'); --计算小数点位置
if v_pos = 0 then
result := v_Str; --纯整数
else
if substr(v_Str, 1, 1) = '-' then
v_zs := substr(v_Str, 2, v_pos - 2); --整数
else
v_zs := substr(v_Str, 1, v_pos - 1); --整数
end if;
v_xs := substr(v_Str, v_pos + 1); --小数
if to_number(nvl(v_zs, '0')) = 0 then
if substr(v_zs, 1, 1) = '-' then
v_zs := '-'; --如果整数为-0则显示负号
else
v_zs := ''; --如果整数为0则不显示整数
end if;
else
v_zs := v_zs || '+'; --整数部份显示样式
end if;
v_fz    := to_number(v_xs); --分子
v_fm    := power(10, length(v_xs)); --分母
v_zdgys := getZDGYS(v_fm, v_fz); --求最大公约数
result  := (v_fz / v_zdgys) || '/' || (v_fm / v_zdgys);
if substr(v_Str, 1, 1) = '-' then
result := '-(' || v_zs || result || ')';
else
result := v_zs || result;
end if;
end if;
return result;
end;

测试结果

Connected to Oracle9i Enterprise Edition Release 9.2.0.7.0
Connected as yzs
SQL> select dftof(0.4) from dual;
DFTOF(0.4)
--------------------------------------------------------------------------------
2/5
SQL> select dftof(3.4) from dual;
DFTOF(3.4)
--------------------------------------------------------------------------------
3+2/5
SQL> select dftof(-92.25) from dual;
DFTOF(-92.25)
--------------------------------------------------------------------------------
-(92+1/4)
SQL> select dftof(-0.375) from dual;
DFTOF(-0.375)
--------------------------------------------------------------------------------
-(3/8)
SQL> select dftof(-.375) from dual;
DFTOF(-.375)
--------------------------------------------------------------------------------
-(3/8)

用Oracle PL/SQL 编程实现小数转分数的方法相关推荐

  1. [顶]ORACLE PL/SQL编程详解之二:PL/SQL块结构和组成元素(为山九仞,岂一日之功)...

    [顶]ORACLE PL/SQL编程详解之二:PL/SQL块结构和组成元素(为山九仞,岂一日之功) 原文:[顶]ORACLE PL/SQL编程详解之二:PL/SQL块结构和组成元素(为山九仞,岂一日之 ...

  2. ORACLE PL/SQL编程详解之二:PL/SQL块结构和组成元素(为山九仞,岂一日之功)

    [顶]ORACLE PL/SQL编程详解之二: PL/SQL块结构和组成元素(为山九仞,岂一日之功) 继上四篇:ORACLE PL/SQL编程之八:把触发器说透                ORAC ...

  3. [顶]ORACLE PL/SQL编程详解之二:PL/SQL块结构和组成元素(为山九仞,岂一日之功)

    [顶]ORACLE PL/SQL编程详解之二: PL/SQL块结构和组成元素(为山九仞,岂一日之功) 继上四篇:ORACLE PL/SQL编程之八:把触发器说透                ORAC ...

  4. ORACLE PL/SQL编程之六:把过程与函数说透(穷追猛打,把根儿都拔起!)

    原文:ORACLE PL/SQL编程之六:把过程与函数说透(穷追猛打,把根儿都拔起!) ORACLE PL/SQL编程之六: 把过程与函数说透(穷追猛打,把根儿都拔起!)   继上篇:ORACLE P ...

  5. [推荐]ORACLE PL/SQL编程之五:异常错误处理(知已知彼、百战不殆)

    原文:[推荐]ORACLE PL/SQL编程之五:异常错误处理(知已知彼.百战不殆) [推荐]ORACLE PL/SQL编程之五: 异常错误处理(知已知彼.百战不殆) 继上三篇:ORACLE PL/S ...

  6. ORACLE PL/SQL编程之八:把触发器说透

    ORACLE PL/SQL编程之八:把触发器说透 ORACLE PL/SQL编程之八: 把触发器说透 大家一定要评论呀,感谢!光发表就花了我将近一个下午. 本篇主要内容如下: 8.1 触发器类型 8. ...

  7. [强烈推荐]ORACLE PL/SQL编程详解之七:程序包的创建与应用(聪明在于学习,天才在于积累!)...

    [强烈推荐]ORACLE PL/SQL编程详解之七: 程序包的创建与应用(聪明在于学习,天才在于积累!) --通过知识共享树立个人品牌.   继上七篇:            [推荐]ORACLE P ...

  8. Oracle PL/SQL编程详解

    Oracle PL/SQL编程详解 - 古立 - 博客园 <我的网络摘抄本> 网摘/转载/备忘/随记 博客园 首页 新随笔 联系 管理 订阅 随笔- 84  文章- 0  评论- 0  & ...

  9. oracle PL/SQL编程基础

    目录 1 PL/SQL介绍 1.1 PL/SQL基础结构 1.2 PL/SQL 注释 1.3 PL/SQL常量和变量 1.4条件语句 1.5 循环语句 过完节由于疫情公司没有进行上班,在收拾房屋的过程 ...

最新文章

  1. 关联查询的resultMap写法示例
  2. ScriptManager调用 无参数WebService
  3. HDU 1848 Fibonacci again and again(博弈)
  4. 《移动应用开发》实验报告——简单的品牌列表
  5. 窗口分析函数_11_生成百分比排名
  6. h2database连接字符串
  7. 用Java编辑实现warshall算法_warshall算法 java实现
  8. java zoneid_java – ZoneId和LocalDateTime
  9. 二叉搜索树的根插入、选择、删除、合并、排序等操作的实现
  10. 石头记特定卡密生成获取get!{石头记卡密使用方法}
  11. 水晶易表Xcelsius 2008安装常见问题小结
  12. 网络口碑推广主要目的全知道
  13. 法国计算机工程师学院排名,法国90所工程师学院最新排行榜
  14. office是什么意思
  15. 微信多开软件苹果版_快手充值快币微信充值苹果版;
  16. dell服务器T100无法进入系统,戴尔电脑开机进不去,一直在转圈圈,怎么处理?
  17. oracle arc安装教程,ArcSDE Oracle的安装教程
  18. CentOS7安装OpenStack(Rocky版)-02.安装Keyston认证服务组件(控制节点)
  19. NIST加密标准是什么意思?
  20. Linux服务器EDAC CE memory read error

热门文章

  1. Linux安装库时安装源错误,linux环境下golang安装第三方库的时候出错的决办法
  2. ocp考题解析create user
  3. Visual Studio 2015简体中文版
  4. 思科 网络安全 考试期末
  5. 你会在场景中创建立体文字吗?可否认识精灵模型?
  6. git tag创建、远程推送、回退以及强推push -f
  7. 冷酷小叶的Java学习笔记Day3
  8. 拥抱开源,Vue Admin Work后台管理系统免费开源啦
  9. 如何将Vufroria 、ARCore和ARkit结合使用
  10. win10启动个性化文字提示