Java中使用Rational类实现分数精确的计算,
在Java中实现分数的精确计算(Rational类)
在Java中想要进行有分数精确的计算,例如1/3=0.33333333…,这个数字不能用double或float来精确的表示浮点形式。为了获得精确地结果,必须使用有理数。
运行截图
链接: link.
图片: 分数的计算结果
Rational类代码如下
public class Rational extends Number implements Comparable {
// 定义私有型分子
private long numerator = 0;
// 定义私有性分母
private long denominator = 1;
public Rational() {
this(0, 1);
}
public Rational(long numerator, long denominator) {
long gcd = gcd(numerator, denominator);
this.numerator = ((denominator > 0) ? 1 : -1) * numerator / gcd;
this.denominator = Math.abs(denominator) / gcd;
}
private long gcd(long n, long d) {
// TODO Auto-generated method stub
long n1 = Math.abs(n);
long n2 = Math.abs(d);
int gcd = 1;
for (int k = 1; k <= n1 && k <= n2; k++) {
if (n1 % k == 0 && n2 % k == 0) {
gcd = k;
}
}
return gcd;
}
public long getNumerator() {
return numerator;
}
public long getDenominator() {
return denominator;
}
// 分数的加法
public Rational add(Rational secondRational) {
long n = numerator * secondRational.getDenominator() + denominator * secondRational.getNumerator();
long d = denominator * secondRational.getDenominator();
return new Rational(n, d);
}
// 分数的减法
public Rational subtract(Rational secondRational) {
long n = numerator * secondRational.getDenominator() - denominator * secondRational.getNumerator();
long d = denominator * secondRational.getDenominator();
return new Rational(n, d);
}
// 分数乘法
public Rational mulitiply(Rational secondRational) {
long n = numerator * secondRational.getNumerator();
long d = denominator * secondRational.getDenominator();
return new Rational(n, d);
}
// 分数除法
public Rational divide(Rational secondRational) {
// TODO Auto-generated method stub
long n = numerator * secondRational.getDenominator();
long d = denominator * secondRational.numerator;
return new Rational(n, d);
}
@Override
public String toString() {
// TODO Auto-generated method stub
if (denominator == 1) {
return numerator + "";
} else {
return numerator + "/" + denominator;
}
}
@Override
public boolean equals(Object parm1) {
// TODO Auto-generated method stub
if ((this.subtract((Rational) (parm1))).getNumerator() == 0) {
return true;
} else {
return false;
}
}
@Override
public int compareTo(Object o) {
// TODO Auto-generated method stub
if ((this.subtract((Rational) o)).getNumerator() > 0) {
return 1;
} else if ((this.subtract((Rational) o)).getNumerator() > 0) {
return -1;
} else {
return 0;
}
}
@Override
public double doubleValue() {
// TODO Auto-generated method stub
return numerator * 1.0 / denominator;
}
@Override
public float floatValue() {
// TODO Auto-generated method stub
return (float) doubleValue();
}
@Override
public int intValue() {
// TODO Auto-generated method stub
return (int) doubleValue();
}
@Override
public long longValue() {
// TODO Auto-generated method stub
return (long) doubleValue();
}
}
测试类代码如下
TestRational类
public static void main(String[] args) {
// TODO Auto-generated method stub
Rational r1 = new Rational(1, 3);
Rational r2 = new Rational(1, 2);
Rational r3 = new Rational(1, 4);
System.out.println(r1 + " + " + r2 + " = " + r1.add(r2));
System.out.println(r1 + " - " + r2 + " = " + r1.subtract(r2));
System.out.println(r1 + " * " + r2 + " = " + r1.mulitiply(r2));
System.out.println(r1 + " / " + r2 + " = " + r1.divide(r2));
System.out.println(r1 + " + " + r2 + " + " + r3 + " = " + (r1.add(r2)).add(r3));
}
导出与导入
导出
如果你想尝试使用此编辑器, 你可以在此篇文章任意编辑。当你完成了一篇文章的写作, 在上方工具栏找到 文章导出 ,生成一个.md文件或者.html文件进行本地保存。
导入
如果你想加载一篇你写过的.md文件,在上方工具栏可以选择导入功能进行对应扩展名的文件导入,
继续你的创作。