3

我正在用 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 。

我一直在努力寻找答案,但失败了。我无法弄清楚如何显示正确的结果。

4

3 回答 3

3

基本上,看起来这是预期的行为Math.Tan。我不太了解其他语言,所以我不确定这对于浮点数学是否正常或特定于 C# 实现。(注意:之后,我发现 Google 的在线计算器返回相同的结果,表明它对浮点三角函数的预期行为,可能与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

所以我的猜测是,除非有人可以进来并提供解决方法,否则您可能必须将此作为边缘情况进行编程才能获得正确的结果。

任何三角函数的“正确结果”都将限于double15 位有效数字的精度,因此如果您需要更多,则需要找到一个支持更精确数学的库。

由于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);
}
于 2012-08-24T12:19:29.117 回答
1

Round正在做它在锡上所说的

可以返回的整数和小数位数的最大总数为 15。如果四舍五入的值包含超过 15 位,则返回 15 个最高有效位。如果四舍五入的值包含 15 位或更少位,则返回整数位和位数参数指定的小数位数。

1.63317787283838E+16是 15 位最高有效数字,并且没有小数部分。

如果你想显示这个,1,63E+016你可以使用:

number.ToString('E2', CultureInfo.CreateSpecificCulture("fr-FR"))

(或任何其他,用作小数分隔符的语言环境)

请参阅:指数(“E”)格式说明符

于 2012-08-24T12:02:56.480 回答
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");
        }
    }
}
于 2015-03-02T02:54:08.660 回答