【问题标题】:Implicitly converting int to double将 int 隐式转换为 double
【发布时间】:2014-04-25 12:58:19
【问题描述】:

所以,我有点困惑。我的印象是这应该有效: 在这种情况下,ab 都是整数(确切地说是计数器)。

由于 a / b 可能包含小数位,整数显然不起作用。 因此,我声明了一个新的 double 并在其中执行了这样的计算:

double texturefactor = ((a / b) * 10);

这不像我预期的那样工作,并且 a / b 的结果始终是我使用 int 执行计算来存储时得到的结果结果。 另一方面,这是可行的:

double calculate1 = a;
double calculate2 = b;
double texturefactor = ((calculate1 / calculate2) * 10);

几个可能很愚蠢的问题- 1. 我确信这应该可行——我知道在某些情况下 VS 会抱怨我试图隐式地从一种类型转换为另一种类型——这就是我想要做的!为什么不呢,我错过了什么吗? :) 2. 我应该只是将计数器 a 和 b 转换为 double 并省去转换的麻烦,还是那麻烦?

【问题讨论】:

  • 试试double texturefactor = (((double) a / b) * 10);
  • 您之前可能已经注意到“返回值”并不重要。它们也不能用于解决方法的“正确”重载 - 因此我们可以使用单个 Write 方法,但必须使用 ReadInt16ReadInt32 等。运算符/重载解析仅基于在操作数上,在您的情况下是 intint

标签: c# implicit-conversion


【解决方案1】:

a / b的结果是另一个整数,所以即使你这样做,伤害已经造成:

double texturefactor = ((a / b) * 10);

尝试将您的内部变量之一转换为double

var texturefactor = (( (double)a / b) * 10);

(double)a / b 的结果将是双精度数,您不会丢失分数。

回答你的第二个问题:

我是否应该将计数器 a 和 b 转换为双精度数

那也行。如果将它们更改为double,则不必执行上述转换。

【讨论】:

    【解决方案2】:

    表达式,包括子表达式的类型,从内到外求值:

    double texturefactor = ((a / b) * 10);
    

    当编译器分析a / b时,它不知道结果稍后会转换为double,所以它只是将计算编译为整数除法。

    将两个操作数之一显式转换为 double 就足以避免这种混淆:

    double texturefactor = (((double)a / b) * 10);
    

    【讨论】:

      【解决方案3】:

      当您有表达式(a / b) 时,C# 编译器会忽略它稍后将被分配给double。它只关注那个表达式,并且看到int / int,所以它使用integer division。这意味着您的结果在转换为 double 之前会向下舍入到下一个整数。

      您需要确保 C# 将除法视为 doubles 的除法,而不是 ints,例如:

      double texturefactor = (((double)a / b) * 10); // or
      double texturefactor = 10d * a / b; // or
      double texturefactor = 10.0 * a / b;
      

      【讨论】:

        【解决方案4】:

        double texturefactor = ((a / b) * 10); 不起作用的原因是右侧的所有参数都是int 类型,因此计算是在int 中完成的,而不是你想象的double

        您可以将ab 显式转换为double。喜欢

        double texturefactor = (((double) a / b) * 10);
        

        在您将ab 定义为双精度后的第二个代码中,现在计算以双精度类型完成。

        【讨论】:

          【解决方案5】:

          您需要将 int 值转换为 double:

          int a = some_value;
          int b = some_value;
          double texturefactor = (double)a / b * 10;
          

          【讨论】:

          • 将一个操作数转换为 double 类型就足以得到一个 double 值。 (double)a/b*10 会得到相同的结果
          【解决方案6】:

          整数除法不会有十进制值,因为您将它们的值分配给double 变量。

          如果你想要精确,那么你的第二种方法是相当不错的。

          double calculate1 = a;
          double calculate2 = b;
          double texturefactor = ((calculate1 / calculate2) * 10);
          

          以上都不错。

          我不建议您将其转换为 double,因为需要支付一些开销。

          【讨论】:

            【解决方案7】:

            两个整数相除的结果总是是一个整数。所以你需要

            double texturefactor = (((double)a / b) * 10);
            

            【讨论】:

              【解决方案8】:

              因此,我声明了一个新的 double 并在其中执行了这样的计算:

              啊,不。

              双纹理因子 = ((a / b) * 10);

              基本语法。你声明一个双精度(纹理因子)。您将纯整数运算的结果分配给它 - (a/b)*10

              由于优先级,这是 a/b(整数,丢弃数字)乘以 10。THEN 隐式转换。

              典型的初学者错误 - 但一个很多。

              你想要一个双精度运算,确保任何元素都是双精度,例如:

              ((双) a/b)*10

              将对所有元素进行浮动点转换。

              【讨论】:

                猜你喜欢
                • 2019-08-18
                • 2020-05-03
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2011-05-10
                • 1970-01-01
                相关资源
                最近更新 更多