我一直在尝试将十进制数转换为有理数,其中十进制数是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
}
方法工作正常。问题是,在输入isInteger
(1/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
,但我不确定是什么。任何帮助将不胜感激。