精确表达浮点数

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

0.9=9/10

0.333(3)=1/3(括号中数字表示循环节)

当然一个小数也可以用好几种分数形式来表示。比如:

0.333(3)=1/3=3/9

问题:给定一个有限小数或是无限循环小数,已分数形式返回这个小数。

解答:首先对于有限小数转化成分数很简单,例如:0.a1...an=a1...an/10^n

对于无限循环小数,例如:0.a1...an(b1...bm)令其为X,

则10^nX=a1...an.(b1...bm)

令Y=0.(b1...bm),

则10^mY=b1...bm.(b1...bm)

10^mY-Y=b1...bm,

从而b1...bm=(10^m-1)Y

所以Y=(b1...bm)/(10^m-1)

0.a1...an(b1...bm)=[(a1...an)*(10^m-1)+b1...bm]/[(10^m-1)*10^n]

当然上面求得的不一定是最简分数,若不是还要进行约分,分子分母同除以分子分母的最大公约数就可以了。

下面给一个例子:

0.33(33)=[33*(10^2-1)+33]/[(10^2-1)*10^2]

=(33*99+33)/9900

=3300/9900

=1/3

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值