我们可以通过自定义分数类,来解决浮点数数字不准确的问题。
class Rational{
private long _a;//分子
private long _b;//分母
public Rational() {
_a=1;
_b=1;
}
//最大公约数
private static long _gcd(long x, long y) {
if (x<0) x= -x;
if (y<0) y= -y;
if (y==0) return x;
return _gcd(y, x%y);
}
public Rational(long a, long b) {
long d = _gcd(a, b);
_a = a/d;
_b = b/d;
}
public Rational add(Rational x) {
return new Rational(this._a * x._b + this._b * x._a, _b * x._b);
}
public Rational mul(Rational x) {
return new Rational(this._a * x._a, this._b * x._b);
}
public Rational negative() {
return new Rational(-this._a, this._b);
}
public Rational sub(Rational x) {
return this.add(this.negative());
}
public Rational inverse() {
return new Rational(this._b, this._a);
}
public Rational div(Rational x) {
return this.mul(this.inverse());
}
public String toString() {
if (_b==1)
return " " + _a;
else
return _a + "/" + _b;
}
}
public class Main{
//自定义浮点数表示方法
public static void main(String[] args) {
Rational a = new Rational(5, 1);
Rational b = new Rational(1, 15);
Rational c = a.add(b);
Rational d = a.div(b);
System.out.println(a);
System.out.println(c);
System.out.println(d);
}
}
这里面有一个求最大公约数的方法,使用的是递归形式的辗转相除法。因为分母一般化为最简分数比的形式。还有就是这里面的加减乘除的写法也是很有意思的。最后不要忘记重写to_string方法。不然不能输出结果。