1

我目前正在编写一个需要预览实时显示的程序,但是预览当然是按比例缩小的。但是,当我缩小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!为什么?

4

6 回答 6

4

4并且3都是ints,所以它变成了1。使它们成为浮点数:

double ratio = 4.0 / 3.0;

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

private void FindOptimalRes(PictureBox picBox)
{
    picBox.Size = new Size(Height / 3, Height / 4);
}
于 2012-07-14T21:43:00.497 回答
3

C# 的数学是“正确的”。对正在做的事情的理解是..缺少:-)

表达式4 / 3(类型int / int)将计算为数值 1,因为它使用整数除法(两个操作数都是整数)。结果 1 然后在赋值时被隐式强制为 double 值。

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

同样,对于Height / 4(假设 Height 是一个整数),这些将起作用:

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

快乐编码!

于 2012-07-14T21:42:57.550 回答
3

你正在做整数除法:

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

这不会为您提供您正在寻找的值,因为小数点被截断,因此评估为1而不是1.333. 至少有一个操作数必须是双精度数:

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

也一样Height。将 更改44.0

于 2012-07-14T21:43:05.377 回答
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;
于 2012-07-14T21:53:17.597 回答
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

于 2012-07-14T21:59:19.117 回答
0

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

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

如果 C# Math 关闭,世界各地的许多东西也会关闭。

于 2012-07-14T21:43:05.043 回答