2

当我尝试求解简单方程时遇到问题。我的方程式是找到学生分数的百分比。这是我的代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace thered_Try
{
    public partial class Form1 : Form
    {
        decimal res;

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            int oneee = 300;
            int two = 1000;
            int thee = 10;
            res = (oneee / two) * 10;
            label1.Text = res.ToString();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            Form2 form = new Form2();
            form.ShowDialog();
        }
    }
}

结果为0。我的错误在哪里?

4

6 回答 6

2

您正在执行两个整数之间的除法 - 这意味着结果也被计算为整数。300 / 1000 是 0……然后你乘以 10,仍然是 0。

选项:

  • 使用浮点运算。您可以通过制作所有变量double或强制转换来做到这一点:

    ret = (int) ((oneee / (double) two) * 10);

    (其他浮点类型也可以工作,例如decimalor float......在某些情况下它们可能会给出非常细微的不同结果。)

  • 乘以 10 :

    res = (oneee * 10) / two;
    

请注意,对于百分比,您希望乘以 100,而不是 10。如果您只想要整数结果并且知道乘法永远不会溢出,则首先乘法可能比使用浮点更简单。

另请注意,要快速尝试此类事情,使用控制台应用程序比使用 Windows 窗体要简单得多。这是一个完整的例子,展示了它的工作原理:

using System;
class Test
{
    static void Main()
    {
        int oneee = 300;
        int two = 1000;
        int res = (oneee * 10) / two;
        Console.WriteLine(res); // 3        
    }
}

编辑:如果您打算使用p格式说明符,则应该使用浮点数:

int marksScored = 300;
int marksAvailable = 1000;
double proportion = ((double) marksScored) / marksAvailable;
string text = proportion.ToString("p1"); // "30.0%"

请注意,除法运算符只有一个操作数需要是 a double- 尽管如果您发现更清楚,您可以同时转换它们

于 2012-12-25T08:27:30.957 回答
0

在所有C基于编程语言(如C#)中,操作将根据表达式中使用的最高类型进行评估。因此,如果将 2 相乘integers,编译器将使用integer乘法,但如果将 afloat和 an相乘integer,编译器将使用float乘法。在您的情况下,您将两个integers 相除,因此编译器将使用integer除法。

要解决您的问题,您应该将其中一个数字转换为float. 您可以通过多种方式做到这一点。这里有几个:

res = ((float) oneee / two) * 10;
res = ((double) oneee / two) * 10;
于 2012-12-25T08:27:40.383 回答
0

您正在使用整数,因此结果也是整数,0.3 变为 0。您应该在计算之前使用 double 或强制转换为 double。

于 2012-12-25T08:28:17.260 回答
0

试试这个:

private void button1_Click(object sender, EventArgs e)
        {
            decimal oneee = 300;
            decimal two = 1000;
            decimal thee = 10;
            decimal aResult = (oneee / two) * 10;
            label1.Text = aResult.ToString("0.00");
        }
于 2012-12-25T08:28:37.610 回答
0

结果的类型取决于使用的变量。

2 秒之间的任何数学运算int都将返回int.
在进行数学运算之前,您需要将其中一个转换为小数:

 res = (oneee / (decimal)two) * 10;
于 2012-12-25T08:28:53.780 回答
0
you are using int and when you are dividing it by 

(1000/300) it will result 0.3. But the data type is int, so result is 0;

Please use below code

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace thered_Try
{
    public partial class Form1 : Form
    {
        decimal res =0;

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            decimal oneee = 300;
            decimal two = 1000;
            decimal thee = 10;
            res = (oneee / two) * 10;
            label1.Text = res.ToString();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            Form2 form = new Form2();
            form.ShowDialog();
        }
    }
}

Thanks, Let me know your result. 
于 2012-12-25T12:35:40.177 回答