我需要访问分母和分子,所以我不能只乘以两个浮点数。 我应该写我自己的类,并有运算符重载(*)或是他们已知的库提供吗?是否有一种标准方法来乘以分数?
2
A
回答
1
恐怕你必须自己写。 Here是链接到的部分结构
代码的链接:
public struct Fraction
{
public int Numerator;
public int Denominator;
public static Fraction Zero = new Fraction(0, 0);
public Fraction(int numerator, int denominator)
{
this.Numerator = numerator;
this.Denominator = denominator;
//If denominator negative...
if (this.Denominator < 0)
{
//...move the negative up to the numerator
this.Numerator = -this.Numerator;
this.Denominator = -this.Denominator;
}
}
public Fraction(int numerator, Fraction denominator)
{
//divide the numerator by the denominator fraction
this = new Fraction(numerator, 1)/denominator;
}
public Fraction(Fraction numerator, int denominator)
{
//multiply the numerator fraction by 1 over the denominator
this = numerator * new Fraction(1, denominator);
}
public Fraction(Fraction fraction)
{
this.Numerator = fraction.Numerator;
this.Denominator = fraction.Denominator;
}
private static int getGCD(int a, int b)
{
//Drop negative signs
a = Math.Abs(a);
b = Math.Abs(b);
//Return the greatest common denominator between two integers
while (a != 0 && b != 0)
{
if (a > b)
a %= b;
else
b %= a;
}
if (a == 0)
return b;
else
return a;
}
private static int getLCD(int a, int b)
{
//Return the Least Common Denominator between two integers
return (a * b)/getGCD(a, b);
}
public Fraction ToDenominator(int targetDenominator)
{
//Multiply the fraction by a factor to make the denominator
//match the target denominator
Fraction modifiedFraction = this;
//Cannot reduce to smaller denominators
if (targetDenominator < this.Denominator)
return modifiedFraction;
//The target denominator must be a factor of the current denominator
if (targetDenominator % this.Denominator != 0)
return modifiedFraction;
if (this.Denominator != targetDenominator)
{
int factor = targetDenominator/this.Denominator;
modifiedFraction.Denominator = targetDenominator;
modifiedFraction.Numerator *= factor;
}
return modifiedFraction;
}
public Fraction GetReduced()
{
//Reduce the fraction to lowest terms
Fraction modifiedFraction = this;
//While the numerator and denominator share a greatest common denominator,
//keep dividing both by it
int gcd = 0;
while (Math.Abs(gcd = getGCD(modifiedFraction.Numerator, modifiedFraction.Denominator)) != 1)
{
modifiedFraction.Numerator /= gcd;
modifiedFraction.Denominator /= gcd;
}
//Make sure only a single negative sign is on the numerator
if (modifiedFraction.Denominator < 0)
{
modifiedFraction.Numerator = -this.Numerator;
modifiedFraction.Denominator = -this.Denominator;
}
return modifiedFraction;
}
public Fraction GetReciprocal()
{
//Flip the numerator and the denominator
return new Fraction(this.Denominator, this.Numerator);
}
public static Fraction operator +(Fraction fraction1, Fraction fraction2)
{
//Check if either fraction is zero
if (fraction1.Denominator == 0)
return fraction2;
else if (fraction2.Denominator == 0)
return fraction1;
//Get Least Common Denominator
int lcd = getLCD(fraction1.Denominator, fraction2.Denominator);
//Transform the fractions
fraction1 = fraction1.ToDenominator(lcd);
fraction2 = fraction2.ToDenominator(lcd);
//Return sum
return new Fraction(fraction1.Numerator + fraction2.Numerator, lcd).GetReduced();
}
public static Fraction operator -(Fraction fraction1, Fraction fraction2)
{
//Get Least Common Denominator
int lcd = getLCD(fraction1.Denominator, fraction2.Denominator);
//Transform the fractions
fraction1 = fraction1.ToDenominator(lcd);
fraction2 = fraction2.ToDenominator(lcd);
//Return difference
return new Fraction(fraction1.Numerator - fraction2.Numerator, lcd).GetReduced();
}
public static Fraction operator *(Fraction fraction1, Fraction fraction2)
{
int numerator = fraction1.Numerator * fraction2.Numerator;
int denomenator = fraction1.Denominator * fraction2.Denominator;
return new Fraction(numerator, denomenator).GetReduced();
}
public static Fraction operator /(Fraction fraction1, Fraction fraction2)
{
return new Fraction(fraction1 * fraction2.GetReciprocal()).GetReduced();
}
public double ToDouble()
{
return (double)this.Numerator/this.Denominator;
}
public override string ToString()
{
return Numerator + "/" + Denominator;
}
}
2
在c#中没有准备好的类。编写自己的应该很容易。我会这样做。
1
0
定义一个简单的对象将是对待一个简单的方法问题。
public class Fraction
{
decimal Denominator {get;set;}
decimal Numerator {get;set;}
public Fraction(decimal denum, decimal num)
{
Denominator = denum;
Numearator = num;
}
//this way you can instantiate a fraction object with any value of your choice
}
,只是后: 分数f =新分数(5,2);
相关问题
- 1. 在遗传算法中是否有一种标准的方法来替代DEAD?
- 2. 在IDA Pro中,是否有一种方法来标记函数?
- 3. 有没有一种标准的方法来检测方向性?
- 4. 是否有一种“标准”方法来实现.NET的软件激活?
- 5. 是否有直接的方法来乘以一个数字的大小或点?
- 6. MATLAB:简单的方法来乘以标准基础
- 7. 在数组中的每个元素乘法是否有一种方法?
- 8. 是否有标准的方法来过滤所有项目
- 9. 乘以2种方法
- 10. 哪一种是最准确的方法来区分8种颜色之一?
- 11. 是否有一种“标准”方式来开发这样的应用程序?
- 12. 是否有一种“标准方式”来解析:Java中的空白URL?
- 13. Selenium有没有一种方法来验证项目的数量是否符合标准?
- 14. 是否有另一种方法来验证$ _POST数据?
- 15. 有没有一种标准的方法来存储密码在数据库中?
- 16. 是否有一种更有效的方法来处理这种差异函数?
- 17. 是否Emacs中有一种方法来对准'=的位于C++枚举
- 18. 是否有一种将URL与IRC用户相关联的半标准方法?
- 19. 有没有一种检测方案实现的标准方法?
- 20. 有没有一种方法来确定是否删除用户?
- 21. 乘以定义的标准分配器
- 22. 有没有一种方法可以区分JavaScript中的鼠标?
- 23. 有没有一种快速有效的方法来在Javascript中乘数组?
- 24. JMeter - 是否有一种方法可以调整负载以实现目标?
- 25. 有没有一种方法来选择的,我想知道是否有一种方法使用jQuery(以链接的方式)来选择以下类型
- 26. 是否有一个标准函数来检查数字是否在范围内?
- 27. 有没有一种标准的方法来验证Web API的应用程序?
- 28. 有没有一种标准的方法来定义HTTP头字段中的CURIE?
- 29. 有没有一种标准的方法来计算在C#语句#
- 30. 有没有一种标准的方法来在Python中做接口注释?
看看这个答案http://stackoverflow.com/a/2941154/659190 – Jodrell 2012-08-14 09:05:12