您的位置:首页 > 其它

2.6 精确表达浮点数

2017-11-11 14:53 381 查看
计算机中,使用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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: