BigDecimal到Fraction - 重复数字的错误

时间:2016-02-04 21:44:57

标签: java rounding bigdecimal fractions

我一直在尝试将十进制数转换为有理数,其中十进制数是hello的实例。这可以很好地找到所有终止小数,但非终止小数会导致舍入错误,我不知道如何修复它们。

生成分数的代码:

BigDecimal

终止分数的所有测试都按预期运行,public static Fraction of(BigDecimal bigDecimal, int decimalCutoff) { bigDecimal = bigDecimal.stripTrailingZeros(); //Get rid of excess zeros int n = 0; //Set up exponent while (!PlasmaBigMathUtil.isInteger(bigDecimal) && n <= decimalCutoff) { //Loop through and build up the exponent n++; } return new Fraction(bigDecimal.scaleByPowerOfTen(n).toBigInteger(), BigDecimal.ONE.scaleByPowerOfTen(n).toBigInteger()); //Return the decimal*10^n over 10^n } 方法工作正常。问题是,在输入isInteger1/3)之类的内容时,会输出3.33...3333333333333333/10000000000000000未缩减)。

reduce方法如下:

33333333333333330000000000000000000000000000000000000000000000000000000000000000000000000000000000000/100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

最大的共同因素是这样实现的(使用Euclid&#39;算法):

public void reduce() {
    BigInteger greater = PlasmaBigMathUtil.greatestCommonFactor(this.numerator, this.denominator);
    this.numerator = this.numerator.divide(greater);
    this.denominator = this.denominator.divide(greater);
}

我希望我可以做一些检查,或者我可以处理以便将public static BigInteger greatestCommonFactor(BigInteger a, BigInteger b) { a = a.abs(); b = b.abs(); return b.equals(BigInteger.ZERO) ? a : PlasmaBigMathUtil.greatestCommonFactor(b, a.mod(b)); } 正确转换为1/3,但我不确定是什么。任何帮助将不胜感激。

0 个答案:

没有答案