我正在使用C#编写计算器。
textBoxResult
是一个文本框,我在其中显示数字
recount
是以度为单位取角度并以弧度为单位的函数
我从texBoxInput
public double recount(int number)
{
double wyjscie = 0.0;
double Number = number;
wyjscie = Number * (Math.PI / 180);
return wyjscie;
}
//function which is called out when user presses the button:
textBoxResult.Text = Math.Round(Math.Tan(recount(Convert.ToInt32(texBoxInput.Text))),2).ToString();
正如您所看到的,我在尝试使用Math.Tan
时对此数字进行舍入,但仍Math.Tan
给我从90度开始的褐色为1,63317787283838E + 16。
我一直试图找到答案,但失败了。我无法弄清楚如何显示正确的结果。
答案 0 :(得分:3)
基本上,这似乎是来自Math.Tan
的预期行为。我不太了解其他语言,所以我不确定这对于浮点数学是否正常或者是否特定于C#实现。 (注意:之后,我发现谷歌的在线计算器返回相同的建议,表明浮点三角函数的预期行为,可能与 pi 不合理的事实和双精度数据类型的限制有关)
然而,从这个结果向后工作,我发现Math.Atan(// your result);
和Math.Atan(double.PositiveInfinity)
都返回90度,表明这是预料到的?
这是我的测试:
var deg = 90.0;
var rads = deg * (Math.PI / 180);
var result = Math.Tan(rads);
if (Double.IsInfinity(result))
Console.WriteLine("Tan of 90 degrees is Infinity");
else if (Double.IsNaN(result))
Console.WriteLine("Tan of 90 degrees is Undefined");
else
Console.WriteLine("Tan of 90 degrees is {0}", result);
Console.WriteLine("Arc Tan of {0} is {1} degrees", double.PositiveInfinity, Math.Atan(double.PositiveInfinity) * 180 / Math.PI);
Console.WriteLine("Arc Tan of {0} is {1} degrees", result, Math.Atan(result) * 180 / Math.PI);
这给出了输出:
Tan of 90 degrees is 1.63317787283838E+16
Arc Tan of Infinity is 90 degrees
Arc Tan of 1.63317787283838E+16 is 90 degrees
所以我的猜测是,除非有人可以进入并提供解决方法,否则您可能需要围绕此进行编程以获得正确的结果。
任何trig函数的“正确结果”将被限制为double
的精度,这是15位有效数字,所以如果你需要更多,你需要找到一个支持的库更精确的数学。
由于Math.Tan(Math.PI/2)
似乎提供了不良反应,您可以执行以下操作:
public double ComputeTangent(double angleRads)
{
if (angleRads == Math.PI/2)
return double.PositiveInfinity
if (angleRads == - Math.PI/2)
return double.NegativeInfinity
return Math.Tan(angleRads);
}
答案 1 :(得分:1)
Round
正在进行exactly what it says on the tin:
可以是的最大总积分和小数位数 返回为15.如果舍入值包含超过15位数,则返回 返回15个最高有效数字。如果舍入值包含 15位或更少的数字,整数位和多个小数位 正如数字参数指定的那样返回。
1.63317787283838E+16
是15位最重要的数字,并且没有小数部分。
如果您希望将其显示为1,63E+016
,则可以使用:
number.ToString('E2', CultureInfo.CreateSpecificCulture("fr-FR"))
(或使用,
作为小数分隔符的任何其他语言环境)
答案 2 :(得分:1)
using System;
namespace Lab_Ex_12
{
class SimpleCalculator
{
double num1, num2;
public void read()
{
Console.WriteLine("\n Enter any two numbers:");
Console.Write("\n Number1 : ");
num1 = double.Parse(Console.ReadLine());
Console.Write("\n Number2 : ");
num2 = double.Parse(Console.ReadLine());
}
public void add()
{
double sum = num1 + num2;
Console.WriteLine("\n Result : ({0}) + ({1}) = {2}", num1, num2, sum);
}
public void subtract()
{
double diff = num1 - num2;
Console.WriteLine("\n Result : ({0}) - ({1}) = {2}", num1, num2, diff);
}
public void multiply()
{
double prod = num1 * num2;
Console.WriteLine("\n Result : ({0}) X ({1}) = {2}", num1, num2, prod);
}
public void divide()
{
double qt = num1 / num2;
Console.WriteLine("\n Result : ({0}) / ({1}) = {2}", num1, num2, qt);
}
}
class ArithmeticOperations
{
public static void Main()
{
SimpleCalculator SC = new SimpleCalculator();
int ch, i=1;
while(i==1)
{
Console.Clear();
Console.WriteLine("\n *************************");
Console.WriteLine("\n ZAHID SIMPLE CALCULATOR.");
Console.WriteLine("\n *************************");
Console.WriteLine("\n 1-----> ADDITION");
Console.WriteLine("\n 2-----> SUBTRACTION");
Console.WriteLine("\n 3-----> MULTIPLICATION");
Console.WriteLine("\n 4-----> DIVISION");
Console.WriteLine("\n 5-----> EXIT");
Console.WriteLine("\n *************************");
Console.Write("\n\n Enter your choice: ");
ch = int.Parse(Console.ReadLine());
switch (ch)
{
case 1: SC.read();
SC.add();
break;
case 2: SC.read();
SC.subtract();
break;
case 3: SC.read();
SC.multiply();
break;
case 4: SC.read();
SC.divide();
break;
case 5: Environment.Exit(-1);
break;
default: Console.WriteLine(" Sorry !!! Wrong choice.");
break;
}
Console.Write("\n Press ENTER to Continue. ");
Console.ReadLine();
}
Console.WriteLine("\n Cannot continue... Bye");
}
}
}