将小数转换为分数

丹多18

我有一种将十进制(双精度值)转换为分数并将分子和分母值转换为大小为2的int []的方法。

测试它对大多数值都适用,除非我命中0.0001然后,返回值为1.0/1.0

方法:

private static int[] toFractionPos(double x){
    String[] parts = Double.toString(x).split("\\.");
    double den = Math.pow(10, parts[1].length()); //denominator
    double num = Double.parseDouble(parts[0]) * den + Double.parseDouble(parts[1]); //numerator
    return reduceFraction((int)num, (int)den);
}

reduceFraction() 方法:

public static int[] reduceFraction(int num, int den){
    int gcf = GCF(num, den); //greatest common factor
    int[] rf = {num/gcf, den/gcf};
    return rf;
}

谢谢!

帧/秒

该算法似乎很好。但是,使用double不适合此类问题,因为精度会随着规模的增长而降低。

您应该使用BigDecimalBigInteger代替。我已经粗略地修改了您的示例,使其可以与它们一起使用,但是我没有处理任何细节,即String无需解析,因为可以BigDecimal使用getter从a检索比例,因此您可以配置不同的舍入模式, ETC:

import java.math.BigDecimal;
import java.math.BigInteger;

public class Sample {

    static int[] toFractionPos(BigDecimal x) {
        String[] parts = x.toString().split("\\.");
        BigDecimal den = BigDecimal.TEN.pow(parts[1].length()); // denominator
        BigDecimal num = (new BigDecimal(parts[0]).multiply(den)).add(new BigDecimal(parts[1])); // numerator
        return reduceFraction(num.intValue(), den.intValue());
    }

    static int[] reduceFraction(int num, int den) {
        int gcd = BigInteger.valueOf(num).gcd(BigInteger.valueOf(den)).intValue(); // greatest
                                                                                   // common
                                                                                   // divisor
        int[] rf = { num / gcd, den / gcd };
        return rf;
    }

    public static void main(String[] args) {
        int[] fraction = toFractionPos(new BigDecimal("0.0001"));
        System.out.println(fraction[0] + "/" + fraction[1]); // 1/10000
    }
}

注意:优化留作练习;)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章