使用计算器(Windows外观相似/确切具体:P)已有一段时间了。设计完全相同。
关于编程,我有一个问题它是一个主要的当我倒数6时,结果是“0.1666666666666667”这也是我得到的,但当我倒数它(“0.1666666666666667”)它再次得到“5.99999999999999 “如何解决这个问题?
正确的是我的。
感谢您的回答。我赞不绝口。
我可以这样做吗?
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();
}
}
答案 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;
但是,为了使类型有用,你需要实现相等,其他数学运算符和转换运算符。