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

.Net技术 码拜 6年前 (2015-05-11) 386次浏览 0个评论

下面中的这段代码  

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();

            }
        }

    
    }
}

1分
progressBar1.Value = (int)(((i + 1) / 50000.0) * 100);
除的是double,不是int,所以最终结果不是0
1分
引用 1 楼 starfd 的回复:

progressBar1.Value = (int)(((i + 1) / 50000.0) * 100);
除的是double,不是int,所以最终结果不是0

很奇怪楼主为什么要除以一个double数!

引用 1 楼 starfd 的回复:

progressBar1.Value = (int)(((i + 1) / 50000.0) * 100);
除的是double,不是int,所以最终结果不是0

能在说明白一点吗

1分
int/int,这是整除,49999/50000 =0
int/double,49999/50000.0=0.99998
这样懂了吗,不是你以为得到的0
1分
做除法前要先转化成浮点运算
5分
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呢?

1分
当 i+1 >= 500 时  (int)(((i + 1) / 50000.0) * 100) >=1
这就是能跑的原因
引用 4 楼 starfd 的回复:

int/int,这是整除,49999/50000 =0
int/double,49999/50000.0=0.99998
这样懂了吗,不是你以为得到的0

那2/50000.0=0.00004强转不就是0;

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

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

1分
引用 9 楼 yh674256 的回复:
Quote: 引用 4 楼 starfd 的回复:

int/int,这是整除,49999/50000 =0
int/double,49999/50000.0=0.99998
这样懂了吗,不是你以为得到的0

那2/50000.0=0.00004强转不就是0;

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

唉,前边的就不说了,毕竟都有不小心犯糊涂的时候。后边的确实有“从众心理”作怪啊!

2分
引用 9 楼 yh674256 的回复:
Quote: 引用 4 楼 starfd 的回复:

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啊,所以你的进度条还是会走

1分
for (int i = 0; i < 50000; i++)
            {

你把代码写在了for循环里,还没加sleep,那么当然一点按钮,值就直接从0变成100了,根本看不到变成1,2,3,的过程

1分
你可以测试一下,循环50000次需要几毫秒

反正根本不是你眼睛能识别的

1分
取几个i带入一下就行了….高中的时候数学题各种代入法,做选择题判断题简直神器,把那帮学的比较死脑筋的同学唬的一愣一愣的
引用 12 楼 sp1234 的回复:
Quote: 引用 9 楼 yh674256 的回复:
Quote: 引用 4 楼 starfd 的回复:

int/int,这是整除,49999/50000 =0
int/double,49999/50000.0=0.99998
这样懂了吗,不是你以为得到的0

那2/50000.0=0.00004强转不就是0;

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

唉,前边的就不说了,毕竟都有不小心犯糊涂的时候。后边的确实有“从众心理”作怪啊!

我的问题好像没有解决哦

1分
引用 18 楼 yh674256 的回复:

我的问题好像没有解决哦

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

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

引用 19 楼 sp1234 的回复:
Quote: 引用 18 楼 yh674256 的回复:

我的问题好像没有解决哦

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

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

 运行了,我明白了象(2/50000.0)*100=0.004,(500/50000.0)*100=1;
也就是说i+1的值在1到500 强转后是0所以计算机会运行500次0再到1,
依次类推到100;

引用 20 楼 yh674256 的回复:
Quote: 引用 19 楼 sp1234 的回复:
Quote: 引用 18 楼 yh674256 的回复:

我的问题好像没有解决哦

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

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

 运行了,我明白了象(2/50000.0)*100=0.004,(500/50000.0)*100=1;
也就是说i+1的值在1到500 强转后是0所以计算机会运行500次0再到1,
依次类推到100;

(2/50000.0)*100=0.4


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明c#中的一个简单问题但我理解不了
喜欢 (0)
[1034331897@qq.com]
分享 (0)

文章评论已关闭!