精确表达浮点数
2014-03-19 14:23
120 查看
在计算机中,使用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.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
相关文章推荐
- 精确表达浮点数
- 编程之美 2.6 精确表达浮点数
- 《编程之美》学而思-精确表达浮点数
- 每日一题(78) - 精确表达浮点数
- 浮点数(有限浮点数、无限循环浮点数)的精确表达
- 编程之美 精确表达浮点数
- 编程之美:精确表达浮点数
- 编程之美2.6精确表达浮点数Java版
- 2.6 精确表达浮点数
- 精确表达浮点数
- 工具类提供精确的浮点数运算
- [编程之美] 2.6 精确表达浮点数
- JavaScript不支持精确的浮点数运算的解决方案
- Java中使用BigDecimal进行浮点数精确计算、超大整数、浮点数等计算
- 读书笔记之编程之美 – 2.6 精确表达浮点数
- 精确表达浮点数
- 《编程之美》---精确表达浮点数子问题---辗转相除法求取最大公约数
- 用java实现浮点数的精确计算
- Java中使用BigDecimal进行浮点数精确计算、超大整数、浮点数等计算,没有数位限制
- 浮点数的分数表达