C# 如何将比率存储在单个变量中并在C中读回#

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

比如说,我有一个系统,必须存储有多少人投票支持战斗机a,有多少人投票支持战斗机B

假设比率是200:1

如何将该值存储在单个变量中,而不是将两个值(a上的投票者数量和B上的投票者数量)存储在两个变量中


您将如何做到这一点?

从问题的措辞来看,这可能不是您想要的答案,但最简单的方法是使用结构:

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列中:)