【问题标题】:convert double to int将 double 转换为 int
【发布时间】:2011-05-10 01:51:52
【问题描述】:

double 转换为int 的最佳方法是什么?应该使用演员表吗?

【问题讨论】:

  • 定义“最佳”。取决于你是否想要向上/向下舍入等。
  • @RPM1984:定义etc. :)
  • @Armen - touche` :) 无论如何都没关系 - Skeet 在这里,其他都不重要。

标签: c# .net casting type-conversion


【解决方案1】:

如果您想要默认截断为零的行为,您可以使用强制转换。或者,您可能想要使用 Math.CeilingMath.RoundMath.Floor 等 - 尽管之后您仍然需要演员表。

不要忘记int 的范围远小于double 的范围。如果值在未经检查的上下文中超出int 的范围,则从doubleint 的转换不会引发异常,而对Convert.ToInt32(double) 的调用会。如果值超出范围,则强制转换的结果(在未经检查的上下文中)显式未定义。

【讨论】:

  • @user:int 的大小始终为 32 位,无论您使用的是 32 位还是 64 位机器。
  • 而且双精度数甚至比 64 位整数还要大。
  • 对于像我这样的 C# 菜鸟:数学和转换都是系统的一部分。所以完整的答案看起来像这样:intVal = System.Convert.ToInt32(System.Math.Floor(dblVal));
  • @user1290746:可以,但您通常只会在文件顶部有using System;,此时它可能只是intVal = Convert.ToInt32(Math.Floor(dblVal));
  • @user1290746:但在这种情况下,我认为建议人们使用完全限定名称不是正确的解决方案 - 更好的解决方案是了解 using 指令。跨度>
【解决方案2】:

如果您使用强制转换,即(int)SomeDouble,您将截断小数部分。也就是说,如果SomeDouble 是 4.9999,则结果将是 4,而不是 5。转换为 int 不会对数字进行四舍五入。如果你想四舍五入使用Math.Round

【讨论】:

    【解决方案3】:

    是的,为什么不呢?

    double someDouble = 12323.2;
    int someInt = (int)someDouble;
    

    使用Convert 类也很有效。

    int someOtherInt = Convert.ToInt32(someDouble);
    

    【讨论】:

      【解决方案4】:

      Convert.ToInt32是最好的转化方式

      【讨论】:

      • 这是一个典型的不安全函数,因为它只接受任何东西。
      【解决方案5】:

      最好的方法是简单地使用Convert.ToInt32。它速度很快,也可以正确地四舍五入。

      为什么要让它变得更复杂?

      【讨论】:

        【解决方案6】:

        我的方法是:

         - Convert.ToInt32(double_value)
         - (int)double_value
         - Int32.Parse(double_value.ToString());
        

        【讨论】:

        • 你不觉得第三种方式过于复杂和缓慢吗?
        • 第三个不适用于带有小数部分的双打。例如,double_value = 0.1
        • 我认为你可以使用 Math.Floor。
        【解决方案7】:

        这是一个完整的例子

        class Example 
        {    
          public static void Main() 
          {    
            double x, y; 
            int i; 
        
            x = 10.0; 
            y = 3.0; 
        
            // cast double to int, fractional component lost (Line to be replaced) 
            i = (int) (x / y); 
            Console.WriteLine("Integer outcome of x / y: " + i); 
          }    
        }
        

        如果要将数字四舍五入为更接近的整数,请执行以下操作:

        i = (int) Math.Round(x / y); // Line replaced
        

        【讨论】:

          【解决方案8】:

          没有一个代码示例表现出学生所期望的正常行为(一半被四舍五入)。大多数人所期望的是:

          double d = 1.5;
          int i = (int)Math.Round(d, MidpointRounding.AwayFromZero);
          

          【讨论】:

            【解决方案9】:

            int myInt = (int)Math.Ceiling(myDouble);

            【讨论】:

              【解决方案10】:

              我认为最好的方法是Convert.ToInt32

              【讨论】:

                【解决方案11】:
                label8.Text = "" + years.ToString("00") + " years";
                

                当您想将其发送到标签或其他东西,并且您不想要任何小数部分时,这是最好的方法

                label8.Text = "" + years.ToString("00.00") + " years";
                

                如果你只想要 2 个,它总是这样

                【讨论】:

                • 这肯定是不是最好的方法,你可能应该收回你的答案。通过使用ToString,您在幕后更新了许多其他昂贵的资源,例如用于特殊目的的字符串格式化程序和解析器。从这里给出的答案中学习。最接近的最佳方法是转换为 int 并截断小数部分或使用 Math.Round 之类的东西来获得您正在寻找的最接近的 int
                猜你喜欢
                • 1970-01-01
                • 2013-06-02
                • 1970-01-01
                • 2019-02-19
                • 2012-09-02
                • 2013-01-20
                • 2014-12-02
                • 1970-01-01
                相关资源
                最近更新 更多