倒数一个数字,然后再将它倒数到原始数字

时间:2013-12-20 08:50:16

标签: c# windows function calculator

使用计算器(Windows外观相似/确切具体:P)已有一段时间了。设计完全相同。

关于编程,我有一个问题它是一个主要的当我倒数6时,结果是“0.1666666666666667”这也是我得到的,但当我倒数它(“0.1666666666666667”)它再次得到“5.99999999999999 “如何解决这个问题?

正确的是我的。

https://lh6.googleusercontent.com/-mJbRF59fgV8/Uksb9_5zFxI/AAAAAAAAADQ/loEiJtCAfp4/w346-h244/HelpCommunity.png


感谢您的回答。我赞不绝口。

我可以这样做吗?

    double chk;
    void Button1Click(object sender, EventArgs e)
    { 
        if (chk == 0) {
            chk = 1 / Convert.ToDouble(txtResult.Text);
            txtResult.Text = chk.ToString();
        }
        else{
            chk = 1 / chk;
            txtResult.Text = chk.ToString();
        }           
    }

3 个答案:

答案 0 :(得分:1)

所有答案都非常好,所以我只想添加一个不同的东西:

由于浮点数和双精度数,甚至小数数的精度有限,因此您永远无法可靠地恢复原始值。但是,您也可以使用它 - 基本上,您应该将结果数字舍入到给定的精度。这会将数字从5.99999舍回到6(无论如何小数位都是伪精度)。

这一切都取决于你真正需要什么样的精度。这够了吗?大。你想要固定的小数精度吗?使用decimal。你绝对需要100%的精度吗?你必须使用有理数(即将数字存储为两个整数,1和6)。一旦你使用非理性操作,例如(某些)平方根等,你就会遇到麻烦,但这完全取决于你实际上要做的事情。

请注意,如果允许除乘法和除法之外的其他操作,即使使用堆栈方法也会很棘手 - 很难使计算器显得“数学”。

答案 1 :(得分:0)

如果你只是担心倒错而不是往返,你可以像这样做一些厚颜无耻的事情:

Dictionary<double, double> reciprocals = new Dictionary<double, double>(); 

private double Reciprocal(double val)
{
    double reciprocal;
    if (reciprocals.TryGetValue(val, out reciprocal))
    {
        return reciprocal;
    }

    reciprocal = 1 / val;
    reciprocals[reciprocal] = val;
    return reciprocal;
}

给你

var r1 = this.Reciprocal(6d); // = 0.1666...
var r2 = this.Reciprocal(r1); // = 6.0

答案 2 :(得分:0)

您可以使用Complex类型执行操作。

或者创建您自己的数字表示,如下所示。


如果你有这种类型

struct Binomial
{
    public int Numerator
    public int Denominator
}

然后,您可以实现适当的运算符来执行所需的数学函数。

例如

struct Binomial
{
    public int Numerator
    public int Denominator

    public static Binomial operator /(int numerator, int denominator)
    {
        return new Binomial
        {
            Numerator = numerator,
            Denominator = deniminator
        };   
    }

    public static Binomial operator /(int numerator, Binomial denominator)
    {
        return new Binomial
        {
            Numerator = numerator * deominator.Denominator,
            Denominator = deomninator.Numerator
        };
    }

    public static Binomial operator /(Binomial numerator, int denominator)
    {
        numerator.Denominator *= denominator;
        return numerator;
    }
}

应该允许您执行接收所需的分区。我将ToString()覆盖作为阅读器的练习。

这将允许

Binomial sixth = 1 / 6;
Binomial roundtrip = 6 / sixth;

但是,为了使类型有用,你需要实现相等,其他数学运算符和转换运算符。