【问题标题】:Dividing by two integers does not return expected result除以两个整数不会返回预期结果
【发布时间】:2012-07-14 21:40:35
【问题描述】:

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

【问题讨论】:

  • 在说C#有数学错误之前,你应该确定你是否有错误
  • 为什么这个问题被否决了?仅仅因为某人对某事一无所知并不是拒绝他的问题的理由。他甚至展示了他的代码和一切。
  • 我认为,也许:“尝试选择一个更准确/反映问题且不那么好斗的标题..”
  • 这是一个很好的阅读:stackoverflow.com/questions/9841332/… 另外,我已经更改了你的标题,以便未来有类似问题的访问者更容易找到这篇文章。我看到 minitech 删除了你的最后一行 - 谢谢@minitech!
  • 好的.. 谢谢你,Dash。我为我的.. noobiness 道歉?任何。 :P 谢谢,再次。哈哈..

标签: c#


【解决方案1】:

43 都是 ints,所以它变成了 1。使它们成为浮点数:

double ratio = 4.0 / 3.0;

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

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

【讨论】:

    【解决方案2】:

    你正在做整数除法:

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

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

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

    Height 也是如此。将4 更改为4.0

    【讨论】:

    • 谢谢。你意识到我在开玩笑说 C# 的数学是错误的,你给了我一个直接(和正确)的答案。 :)
    【解决方案3】:

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

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

    另一方面,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
    

    编码愉快!

    【讨论】:

    • 作为记录,我确实知道 C# 的数学是正确的。自从我进行一般编程以来已经有一段时间了,自从使用 C# 以来已经有将近一年的时间了,所以我只是忘记了那个小规则。但是感谢您的正确答案并提醒我这一点。 :P
    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

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

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

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

      【讨论】:

        【解决方案6】:

        你正在做整数除法。

        你需要做的是:

        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

        【讨论】:

          猜你喜欢
          • 2018-02-13
          • 2016-05-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-01-22
          • 1970-01-01
          • 1970-01-01
          • 2017-10-19
          相关资源
          最近更新 更多