除以两个整数不会返回预期结果

时间:2012-07-14 21:40:35

标签: c#

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

6 个答案:

答案 0 :(得分:4)

43都是int s,因此转为1。让它们成为浮点点:

double ratio = 4.0 / 3.0;

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

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

答案 1 :(得分:3)

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

表达式4 / 3(类型int / int)将评估为整数值1,因为它使用整数除法(两者都是 operands 是整数)。然后,结果1在赋值时被隐式强制转换为double值。

另一方面,4d / 3将“正常”(并导致 double 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

快乐的编码!

答案 2 :(得分: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

答案 3 :(得分:2)

确保除法结果为double

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

并且无需将输入值设置为double。

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;

答案 4 :(得分:0)

也许你应该进行小数除法而不是整数除法:

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

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

答案 5 :(得分: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。

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