C# 如何将比率存储在单个变量中并在C中读回#
比如说,我有一个系统,必须存储有多少人投票支持战斗机a,有多少人投票支持战斗机B 假设比率是200:1 如何将该值存储在单个变量中,而不是将两个值(a上的投票者数量和B上的投票者数量)存储在两个变量中C# 如何将比率存储在单个变量中并在C中读回#,c#,C#,比如说,我有一个系统,必须存储有多少人投票支持战斗机a,有多少人投票支持战斗机B 假设比率是200:1 如何将该值存储在单个变量中,而不是将两个值(a上的投票者数量和B上的投票者数量)存储在两个变量中 您将如何做到这一点?从问题的措辞来看,这可能不是您想要的答案,但最简单的方法是使用结构: struct Ratio { public Ratio(int a, int b) { this.a = a; this.b = b; } p
您将如何做到这一点?从问题的措辞来看,这可能不是您想要的答案,但最简单的方法是使用结构:
struct Ratio
{
public Ratio(int a, int b)
{
this.a = a;
this.b = b;
}
public int a = 1;
public int b = 1;
}
您几乎肯定希望使用属性而不是字段,并且您可能还希望重载==
和=代码>,类似于:
public static bool operator ==(Ratio x, Ratio y)
{
if (x.b == 0 || y.b == 0)
return x.a == y.a;
// There is some debate on the most efficient / accurate way of doing the following
// (see the comments), however you get the idea! :-)
return (x.a * y.b) == (x.b / y.a);
}
public static bool operator !=(Ratio x, Ratio y)
{
return !(x == y);
}
public override string ToString()
{
return string.Format("{0}:{1}", this.a, this.b);
}
它认为您需要在字符串中对单个变量执行该操作
string s=string.Format("{0}:{1}", 3, 5);
阵列int[]ratio=newint[2]
比两个变量的整个结构/类要细得多。不过,如果要向其中添加帮助器方法,可以使用结构。根据定义,比率是两个数字相除的结果。因此,只需进行该除法并将结果存储在一个双精度:
double ratio = (double)a/b;
您可以像这样使用struct:
struct Ratio
{
public void VoteA()
{
A++;
}
public void VoteB()
{
B++;
}
public int A { get; private set; }
public int B { get; private set; }
public override string ToString()
{
return A + ":" + B;
}
}
如果你只有两种选择的话,实施投票就足够了。否则,您应该实现接受选项数的构造函数、存储投票数的数据结构、投票方法或索引运算符。
如果您需要某些积分数学应用程序的比率,您可能需要实现GCD方法。string ratio=“200:1”//简单:)在我看来,你可以用双打
比率数
1:200 1.200
200:1200:1
0:10.1
1:01.0
0:0.0
它很容易使用
firstNumber = (int)Number;
secondNumber = Number - firstNumber;
比率始终为X:1,在这种情况下没有理由保存最后一个数字,只保存X,在这种情况下保存200。如果最后一个数字不是1,请给出一个例子。一个更好的问题是你为什么要这样做?将其存储在两个变量中有什么问题?我可以想出很多不应该这样做的理由…比率可以是X:Y,其中X&Y可以有任何正值,并且永远不为零。比率实际上不是两个数字的结果。。。比率为1:0时如何?如果比率为1:0,则可以使用错误代码,例如-1,并且可以使用-2作为0:0的错误代码。然而,还有另一个问题,因为在编程中(x/y)*y=x并不总是正确的,因为计算机的除数精度不可能达到100%。例如1/3=0.333333…333333。。。事实上,计算机并不能精确地存储这些信息。例如,计算机存储0.333333。这样,(1/3)*3=0.333333*3=0.999999!=1.这就是为什么我们必须考虑除法不精确的比率,即使我们有一个错误代码1/0和0/0。+ 1,Timwi。尽管如此,比率所包含的信息比除法的结果更多。这取决于比率的用途,即计算的精度是否可能存在问题。例如,如果除了存储比率(假设为1/3)外,您还存储了投票人的数量(假设为400),那么当您在每一方对投票人进行操作时,您知道这是一个整数,因此,如果您获得的投票人数量为100.00001和299.9999或类似值,则您可以毫无问题地进行取整。这实际上取决于使用的上下文,所以我们不能说它是否足够。我个人认为在大多数情况下都是这样。尽管皮埃尔说在这种情况下1:0不可能发生,但我仍然觉得有必要无意识地论证我的观点!:-)从数学上讲,比率是“两个相同类型的数字之间的关系”(来自维基百科)——这两个数字可以是分数,零,负——它们甚至可以是复杂的,所以1:0和0:0绝对是比率。我不会说它更细——运行时内存与结构使用相同。实际上,为了进行可靠的比较(我的意思是==
操作符)你应该使用乘法而不是整数除法,也就是说:返回(x.a*y.b)==(x.b*y.a);
这个==操作符有一个错误。如果x.a是1,y.a是2,而两个b都是3,整数除法将为两个比率产生0。@JeremyP:这正是我在第一条评论中试图指出的;)@对不起,错过了你的第一条评论。虽然从技术上讲,您的答案有可能出现整数溢出。在构造函数中,我将这些数字减少为互质,然后比较a和bs@JeremyP:是的,你是对的,那是正确的方法。但是减少一个分数在计算上可能会很昂贵,所以如果你认为没有这么大的值,你仍然可以使用我的简单方法(也许使用int64为乘法提供更多的空间),所以1:20==1:200?根据您的建议,这两种都存储为12亿次!作为一个优点-这可以保存在单个db列中:)