2.6 精确表达浮点数

计算机中,使用float或double来存储小数是不能得到精确值的。如果希望得到精确结果,最好用分数形式来表示小数。有限小数或无限循环小数都可以转化为分数。

如: 0.9=9/10; 0.333(3)=1/3 (括号中的数字表示循环节)

当然一个小数可以用好几种分数形式来表示。如: 0.333(3)=1/3=3/9

给定一个有限小数或无限循环小数,能否以分母最小的分数形式来返回这个小数?如果输入为循环小数,循环节用括号标出来。


分析:题目中输入的小数,要么为有限小数X= 0.a1a2…an,要么为无限循环小数X= 0.a1a2…(b1b2…bm),X表示式中的字母a1a2…b1b2…bm都是0~9的数字,括号部分(b1b2…bm)表示循环节,主要就是考虑这两种情况。

对于有限小数X= 0.a1a2…an来说,X就等于 a1a2…an/10^n;

对于无限循环小数X= 0.a1a2…(b1b2…bm),其复杂部分在于小数点后同时有非循环部分和循环部分,可以做如下转换:

X= 0.a1a2…(b1b2…bm)
10^n * X= a1a2…an.(b1b2…bm)
10^n * X= a1a2…an+ 0.(b1b2…bm)
X=(a1a2…an+ 0.(b1b2…bm)) / 10^n

对于整数 部分a1a2…an。不需要做额外处理,只需要把小数部分转化为分数形式再加上这个整数即可。对于后面的无限循环部分,可以采用如下方式进行处理:

Y=0.b1b2…bm
10^m * Y =b1b2…bm .(b1b2…bm)
10^m * Y =b1b2…bm + 0.(b1b2…bm)
10^m * Y  - Y = b1b2…bm
Y= b1b2…bm/ (10^m - 1)

将Y代入前面的X的等式,可得:
X=(a1a2…an+ Y) / 10^n
 =(a1a2…an+ b1b2…bm/ (10^m - 1)) / 10^n
 =((a1a2…an) * (10^m - 1) + b1b2…bm) /((10^m - 1) * 10^n)


至此,便可以得到任意一个有限小数或无限循环小数的分数表示,但是此时分母未必是最简的,应该对分子和分母进行约分,这个相对比较简单。

对于任意个分数A/B,可以简化为(A/Gcd(A,B)) / (B/gCD(A,B)),其中Gcd函数为求A和B的最大公约数。


综上所述,先求得小数的分数表示方式,再求其分子分母进行约分,便能够得到分母最小的分数表现形式。


Eg: 对于小数0.3(33),根据以上方法,可以转化为分数:

0.285714(285714)
= (285714 *(10^6-1) +285714) /((10^6-1) * 10^6)
=(285714 * 999999 + 285714)/ 999 999 000 000
=285714 / 999 999
= 2 / 7


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值