得到一个小数,咋写个函数把它转化为最简的分数

如果是无限循环小数,按么循环节的位数除以对应位数的9就可以了。

例如1/7是0.(142857),循环节142857,写成分数就是142857/999999,然后约分就可以了。

约分用GCD即可

■网友
public class GetFraction { public static void main(String args) { getFraction("1234"); getFraction("12.4231213344"); getFraction("0.0001256"); } public static void getFraction(String data) { int index = data.indexOf(\u0026#39;.\u0026#39;); if (index \u0026lt; 0) { data += ".0"; index = data.indexOf(\u0026#39;.\u0026#39;); } //转换为BigDecimal,最大限度保留精度 BigDecimal decimal = new BigDecimal(data); int rightLength = data.length() - index - 1; //求小数点左右的数 String left = data.substring(0, index); String right = data.substring(index + 1); //求分子和分母 BigInteger numerator = new BigInteger(left + right); BigInteger denominator = new BigInteger("10"); denominator = denominator.pow(rightLength); //求最大公约数 BigInteger gcd = numerator.gcd(denominator); //约分 numerator = numerator.divide(gcd); denominator = denominator.divide(gcd); System.out.println(data+" is equal "+numerator+" / "+denominator); }}运行结果:
1234.0 is equal 1234 / 112.4231213344 is equal 3882225417 / 3125000000.0001256 is equal 157 / 1250000中间对于小数点的处理用到了String,因为实在懒得查BigDecimal的方法了:(
就这样吧。

■网友
咱之前写过一个适用于全小数的
是用的double的存储特性,可以得到这个小数的分数形式
直接上代码吧
void getre (double f, int \u0026amp;z, int \u0026amp;m) {\tint times = 0;\twhile (f \u0026lt;= 2147483647.0 \u0026amp;\u0026amp; times \u0026lt; 31) {\t\tf *= 2;\t\ttimes++;\t\t//m *= 2;\t}\tz = from / 2;\ttimes--;\tif (times \u0026lt; 0) times = 0;\tm = 1 \u0026lt;\u0026lt; times;\tint g = gcd (z, m);\tz /= g;\tm /= g;}输入是double,输出z是分子,m是分母【原谅咱英语渣】
因为double的存储精度问题,比如1.0,得到的分数基本不会是1/1,但是你用1.0*z/m再输出,会得到1.0000【精确到几位来着,我忘了】
当时写这个主要是为了做几何题用,后来发现根本不需要~
优化异常laji,求dalao们轻喷

■网友
谢邀说实话算法方面我有点弱的。不过我知道不是所有的小数都能用分数表示的。你得先确定该小数能用分数表示。然后算出分子分母的最大公约数,如果不为一就可以各自除以最大公约数得到最简分数了。至于如何确定该小数,或者这么说吧,你怎么向计算机描述该小数?这个能具体说明一下吗?
■网友
吐槽下问题:你都得到一个小数了,必定不是无限循环小数。若是无限循环小数,在计算机里又必定是用分数储存的,或者是近似数。下面的回答是以:「如何将小数化为分数?」这个问题的作答最近在写的roguelike里正好有这个奇葩的需求,我是这么实现的
function getFraction2(x) local t1,t2 = math.modf(x); local digit = string.len(tostring(t2)) - 2; local denominator = math.pow(10,digit); local numerator = x*denominator; local g = gcd(numerator,denominator); return numerator/g,denominator/g;end


推荐阅读