【问题标题】:C# simple divide problemC#简单除法问题
【发布时间】:2010-11-12 08:39:07
【问题描述】:

我有这个:

 double result = 60 / 23;

在我的程序中,结果是 2,但正确的是 2,608695652173913。问题出在哪里?

【问题讨论】:

    标签: c#


    【解决方案1】:

    60 和 23 是整数文字,因此您进行整数除法,然后分配给双精度数。整数除法的结果是2。

    试试

    double result = 60.0 / 23.0;
    

    或者等价

    double result = 60d / 23d;
    

    d 后缀告诉编译器你打算写一个双重文字。

    【讨论】:

    • 我认为这应该被标记为答案,因为标记为答案的解释复制了这个..
    • @尼克,如果你认为我没有复制它,所以我正在更新它
    【解决方案2】:

    您可以使用以下任何一种都将给出2.60869565217391:

     double result = 60 / 23d;  
     double result = 60d / 23;  
     double result = 60d/ 23d;  
     double result = 60.0 / 23.0;   
    

    但是

    double result = 60 / 23;  //give 2
    

    说明:

    如果任何一个数字是双倍的,它会给出一个双倍的


    编辑:

    文档

    表达式的求值是根据以下规则执行的:

    • 如果其中一种浮点类型为 double,则表达式的计算结果为 double(在关系或布尔表达式的情况下为 bool)。

    • 如果表达式中没有 double 类型,则计算结果为 float(在关系或布尔表达式的情况下为 bool)。

    【讨论】:

      【解决方案3】:

      会有用的

      double result = (double)60 / (double) 23;
      

      或者等价

      double result = (double)60 /  23;
      

      【讨论】:

      • 尽管编译器会适当地优化它,但此代码会产生以下行为:取整数 60,然后将其转换为双精度数。取整数 23,然后将其转换为双精度数。将两个演员的结果分开。最好首先使用双精度值(如 James Gaunt 的回答)
      • 但这只是(?)如果您不处理固定数字而是处理整数变量的方式。
      • 这样你真的希望编译器会优化掉演员表。正如它所写的那样,它只是通过执行运行时类型转换引入了额外的工作。它有效 - 但它有点难看。
      • @Jens:是的,如果您需要使用整数变量但需要浮点结果,唯一的解决方案是强制转换它们。但如果你有某种常量,那么你应该为它使用正确的类型。
      【解决方案4】:

      (双)60 / 23

      【讨论】:

      • 它实际上会 - 类型转换 (double) 的优先级高于除法,并且双精度除以 int 会导致双精度。但是 60.0/23.0 更清晰,因此是更好的答案。
      【解决方案5】:

      已经有一段时间没有使用 C#了,但是你正在将两个整数相除,据我所知,这使得结果也是一个整数。

      你可以通过添加字母“d”来强制你的数字文字是双精度的,就像这样:

      double result = 60d / 23d;
      

      【讨论】:

      • 好的,这行得通。但是怎么做,如果我有这个:double result = 60d /someList.Count;
      • 对另一个操作数使用转换函数。例如:Convert.ToDouble(someList.Count)
      • 双倍结果 = 60d /System.Convert.ToDouble(someList.Count);
      • 如果至少有一个操作数也是双精度数,则结果也应该仍然是双精度数。您可以通过将变量转换为 double 或使用如上所示的 double 文字来确保是这种情况。
      【解决方案6】:

      双倍结果 = 60.0 / 23.0;

      【讨论】:

        【解决方案7】:

        最佳做法是正确装饰数字以使其适合其类型。这不仅避免了您遇到的错误,而且使代码更具可读性和可维护性。

        double x = 100d;
        single x = 100f;
        decimal x = 100m;
        

        【讨论】:

          【解决方案8】:

          将被除数和除数转换为双精度值,结果是双精度
          双分辨率 = 60d/23d;

          【讨论】:

          • 与已经给出和接受的答案有什么区别??
          【解决方案9】:

          补充一下到目前为止所说的... 60/23 是对两个常量的操作。编译器将结果识别为常量并预先计算答案。由于运算是对两个整数进行的,所以编译器使用整数结果 60/23 的整数运算的结果为 2;因此编译器有效地创建了以下代码:

          double result = 2;
          

          正如已经指出的那样,您需要告诉编译器不要使用整数,将一个或两个操作数更改为非整数将使编译器使用浮点常量。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2011-08-29
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多