将失去精度的小数转化为分数的java实现

来源:互联网 发布:财经新闻读者阅读数据 编辑:程序博客网 时间:2024/05/06 18:41


对于无限循环与无限不循环的小数转化为分数(也就是无精度损失的小数),以下有相关博文,大家可以去参考

http://www.zizhujy.com/blog/post/2014/01/21/将小数转化为分数的算法.aspx

而我下面的这个小程序面对的是失去精度的小数如何转化为分数

啥也别说了,先上源码

package cn.qunye.math;import org.junit.Test;public class MyMath2{@Testpublic void test() throws Exception{//测试方法String back = Util2.getFractions(0.2084);//测试的数据System.out.println("result--->"+back);}}class Util2{public static String getFractions(double decimals){int[] back; int lastArr[] = {(int)decimals,1};int nextArr[] = {(int)decimals+1,1};while(!(Math.abs((double)lastArr[0]/lastArr[1] - decimals) < 0.0001 
|| Math.abs((double)nextArr[0]/nextArr[1] - decimals) < 0.0001)){back = test(lastArr,nextArr,decimals);if(back[1] != 0){return back[0]+"/"+back[1];}}return "没有找到合适的分数";}public static int[] test(int lastArr[],int nextArr[],double decimals){int terrorist = lastArr[0]*2+1;int denominator = lastArr[1]*2;if((double)terrorist/denominator > decimals){nextArr[0] = terrorist;nextArr[1] = denominator;lastArr[0]*=2;lastArr[1]*=2;}else{lastArr[0] = terrorist;lastArr[1] = denominator;nextArr[0]*=2;nextArr[1]*=2;}//进入第二步测试System.out.println("==========="+lastArr[0]+"/"+lastArr[1]+"-->"+nextArr[0]+"/"+nextArr[1]+"==========");int leftTerrorist = lastArr[0];int leftDenominator = nextArr[0];int rightDenominator = nextArr[1];int left;while((double)leftDenominator/(rightDenominator) > decimals){rightDenominator*=2;}left = rightDenominator/2;int[] back = {0,0};for(int i=leftTerrorist;i<leftDenominator*2;i++){back = test2(i,left,rightDenominator,decimals);if(back[1] != 0)return back;}return back;}public static int[] test2(int terrorist,int left,int right,double decimals){int []back = {0,0};while(right - left > 1){int middle = (left + right)/2;if(Math.abs((double)terrorist/middle - decimals) < 0.0001){back[0] = terrorist;back[1] = middle;return back;}if((double)terrorist/middle > decimals){left = middle;}elseright = middle;}return back;}}


其实实现起来总的并不是很困难,主要用到了二分法的一个思想,如果大家有更好的做法可以交流

0 0
原创粉丝点击