当前位置: 代码迷 >> C# >> c#中的一个简单有关问题但小弟我理解不了
  详细解决方案

c#中的一个简单有关问题但小弟我理解不了

热度:83   发布时间:2016-05-05 03:53:35.0
c#中的一个简单问题但我理解不了
下面中的这段代码  

progressBar1.Value = (int)(((i + 1) / 50000.0) * 100);

value的值是0;为什么进度条还能跑???帮帮忙各位


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 其他控件
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            for (int i = 0; i < 50000; i++)
            {

               
                textBox1.Text = i.ToString();
              
                progressBar1.Value = (int)(((i + 1) / 50000.0) * 100);
                Application.DoEvents();


            }
        }

    
    }
}

------解决思路----------------------
progressBar1.Value = (int)(((i + 1) / 50000.0) * 100);
除的是double,不是int,所以最终结果不是0
------解决思路----------------------
引用:
progressBar1.Value = (int)(((i + 1) / 50000.0) * 100);
除的是double,不是int,所以最终结果不是0

很奇怪楼主为什么要除以一个double数!
------解决思路----------------------
int/int,这是整除,49999/50000 =0
int/double,49999/50000.0=0.99998
这样懂了吗,不是你以为得到的0
------解决思路----------------------
做除法前要先转化成浮点运算
------解决思路----------------------
for (int i = 0; i < 50000; i++)
{


    textBox1.Text = i.ToString();

    progressBar1.Value = (int)(((i + 1) / 50000.0) * 100);
    textBox1.Text = ((int)(((i + 1) / 50000.0) * 100)).ToString();
    Application.DoEvents();


}


你的计算表达式,就是将0~5000之间的数投影在0~100之间的数轴上的。你怎么能说它一直为0呢?
------解决思路----------------------
当 i+1 >= 500 时  (int)(((i + 1) / 50000.0) * 100) >=1
这就是能跑的原因

------解决思路----------------------
撸主,
for循环,每次 (int)(((i + 1) / 50000.0) * 100)的值是变化的撒
这个是你看到进度的原因
------解决思路----------------------
(int)(((i + 1) / 50000.0) * 100)

这个表达式从0一直跑到100,而且它的结果也确实是整数值!


------解决思路----------------------
引用:
Quote: 引用:

int/int,这是整除,49999/50000 =0
int/double,49999/50000.0=0.99998
这样懂了吗,不是你以为得到的0
那2/50000.0=0.00004强转不就是0;


是的,很多人没有在意(int)转换。

唉,前边的就不说了,毕竟都有不小心犯糊涂的时候。后边的确实有“从众心理”作怪啊!
------解决思路----------------------
引用:
Quote: 引用:

int/int,这是整除,49999/50000 =0
int/double,49999/50000.0=0.99998
这样懂了吗,不是你以为得到的0
那2/50000.0=0.00004强转不就是0;

但是当i>499时,(500/50000.0)*100的值是1啊,所以你的进度条还是会走
------解决思路----------------------

------解决思路----------------------
for (int i = 0; i < 50000; i++)
            {

你把代码写在了for循环里,还没加sleep,那么当然一点按钮,值就直接从0变成100了,根本看不到变成1,2,3,的过程
------解决思路----------------------
你可以测试一下,循环50000次需要几毫秒

反正根本不是你眼睛能识别的
------解决思路----------------------
取几个i带入一下就行了....高中的时候数学题各种代入法,做选择题判断题简直神器,把那帮学的比较死脑筋的同学唬的一愣一愣的
------解决思路----------------------
引用:
我的问题好像没有解决哦


你有没有自己动手运行一下 #7 楼的程序呢?

如不自己动手而只是动嘴,你是自己的解决问题方式让你跨不进门槛里。
  相关解决方案