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

C# 除以两个整数不会返回预期结果,c#,C#,我目前正在编写一个程序,需要实时显示的预览,但预览当然是缩小的。但是,当我向下缩放图片盒时,大小不正确。为了使刻度正确,宽度和高度的比例必须为4:3。代码如下: private void FindOptimalRes(PictureBox picBox) { double h = Height / 4; double ratio = 4 / 3; picBox.Size = new Size((int)(h * ratio), (int)h); } 在测试中,高度(表单

我目前正在编写一个程序,需要实时显示的预览,但预览当然是缩小的。但是,当我向下缩放
图片盒时,大小不正确。为了使刻度正确,宽度和高度的比例必须为4:3。代码如下:

private void FindOptimalRes(PictureBox picBox)
{
    double h = Height / 4;
    double ratio = 4 / 3;
    picBox.Size = new Size((int)(h * ratio), (int)h);
}
在测试中,
高度
(表单的高度)是400,因此,新尺寸的宽度应该是133。但它总是被调整到100×100!为什么?

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

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

另一方面,
4d/3
将“起作用”(并导致双精度1.333),因为现在它是
double/int
->
double/double(通过提升)
->
double
,使用适当的浮点除法

类似地,对于
Height/4
(假设Height是一个整数),它们也可以工作:

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

快乐编码

4
3
都是
int
s,所以它变成了
1
。让它们成为浮点值:

double ratio = 4.0 / 3.0;
请注意,您在
高度方面也犯了同样的错误(现在这无关紧要,但会-将其更改为
4.0
)。如果这是实际的代码,为什么要除以4再乘以4

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

也许您应该进行十进制除法,而不是整数除法:

double h = Height / 4.0;
double ratio = 4 / 3.0;
double ratio = 4 / 3; // evaluates to 1

如果C#Math被关闭,世界上很多东西也会被关闭。

你在做整数除法:

double h = Height / 4.0;
double ratio = 4 / 3.0;
double ratio = 4 / 3; // evaluates to 1
这不会给出您要查找的值,因为小数点被截断,因此计算结果为
1
,而不是
1.333
。至少有一个操作数需要为双精度:

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

高度也一样。将
4
更改为
4.0

确保除法结果为
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;

你在做整数除法

您需要做的是:

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,你应该先确定你是否有错误,然后再说C#有数学错误为什么这个问题被否决了?仅仅因为某人对某件事一无所知并不是对他的问题投否决票的理由。他甚至展示了他的代码和所有东西。我想,也许是:“试着选择一个更准确的/反映问题的,不那么好斗的标题……”这是一个很好的读物:另外,我已经更改了你的标题,让未来有类似问题的访问者更容易找到这篇文章。我看到minitech删除了你的最后一行-谢谢@minitech!可以谢谢你,达什。我为我的……道歉。。无意义?不管怎样再次谢谢。哈哈,谢谢你。你意识到我是在开玩笑说C的数学不好,你给了我一个直接(正确)的答案作为记录,我确实知道C#的数学是正确的。我已经有一段时间没有编写一般的程序了,在C#中也差不多有一年了,所以我忘了那个小规则。但谢谢你的正确回答,也谢谢你提醒我这一点P