2012-07-14 27 views
0

我目前正在编写一个程序,需要预览实时显示,但预览当然会缩小比例。但是,当我缩小PictureBox时,尺寸不正确。为了使标尺正确,宽度和高度需要为4:3的比例。下面的代码:除以两个整数不会返回预期结果

private void FindOptimalRes(PictureBox picBox) 
{ 
    double h = Height/4; 
    double ratio = 4/3; 
    picBox.Size = new Size((int)(h * ratio), (int)h); 
} 

在测试中,Height(表格的高度)为400,所以,新尺寸的宽度应为133,但它总是被调整到100 × 100!为什么?

+5

你应该确保你说错了之前说C#有一个数学错误 – 2012-07-14 21:44:07

+3

为什么这个问题downvoted?仅仅因为某人不了解某件事情并不是降低他的问题的理由。他甚至展示了他的代码和一切。 – 2012-07-14 21:44:35

+2

我想,也许是:“试着选择一个更准确/问题反映和较不好斗的标题..” – 2012-07-14 21:54:11

回答

4

43都是int s,所以它变成了1。让他们的东西浮点:

double ratio = 4.0/3.0; 

请注意,你也Height犯同样的错误(也不要紧,现在,但它会 - 将其更改为4.0)。如果这是实际的代码,为什么再除以四乘以四呢?

private void FindOptimalRes(PictureBox picBox) 
{ 
    picBox.Size = new Size(Height/3, Height/4); 
} 
3

C#的数学是“正确的”。是做什么工作的理解是..失踪:-)

表达4/3(的int/int型),因为它是用整数除法将评估在整数值1(两个操作数整数)。结果1然后在赋值时被隐式强制为双值。

在另一方面4d/3将(在 1.333_和结果)的“工作”,因为现在是double/int - 使用适当的浮点除法>double - >double/double (by promotion)

同样,对于Height/4(假设身高为整数),这将工作:

(double)Height/4   // double/int -> double 
Height/4d     // int/double -> double 
(double)Height/(double)4 // double/double -> double 

编码愉快!

+1

为了记录,我知道C#的数学是正确的。自从我在C#编程之后的一般时间和将近一年的时间里开始编写程序已经有一段时间了,所以我只是忘记了这个小规则。但是,谢谢你的正确答案,并提醒我这一点。 :P – 2012-07-14 22:10:22

0

也许你应该做一个小数除法,而不是整数除法:

double h = Height/4.0; 
double ratio = 4/3.0; 

如果C#数学是关闭很多事情在世界各地将关闭为好。

3

你正在做的整数除法:

double ratio = 4/3; // evaluates to 1 

这会不会给你你正在寻找的,因为小数点被截断的值,从而评估对1而不是1.333。至少有一个操作数必须是双:

double ratio = 4.0/3.0; // evaluates to 1.333 

也是一样的Height。将4更改为4.0

+0

谢谢。你意识到我是在开玩笑C#的数学被忽略,你给了我一个直接的(和正确的)答案。 :) – 2012-07-14 21:49:32

2

确保选中划分结果是double

double ratio = (double) 4/3; // double division 

,并没有必要设置你的输入值的两倍。

var num1 = // an integer number 
var num2 = // an integer number 

//result is integer, because of integer/integer uses 'integer division' 
double result = num1/num2; 

//result is double , because of you forced to 'double division' 
double result = (double) num1/num2; 
0

你在做整数除法。

你需要做的是这样的:

private void FindOptimalRes(PictureBox picBox) 
{ 
    double h = Height/4D; // or Height/4.0 
    double ratio = 4D/3D; // or 4.0/3.0 
    picBox.Size = new Size((int)(h * ratio), (int)h); // Size is now correct [133,100] 
} 

当你做一个数学运算与字面整数(没有小数位),它是隐式类型为int。

只需在文字(4D,3D)的末尾添加大写字母D将会将它们键入为双精度,并且您的数学运算正确。或者你可以写4.0,3.0