【问题标题】:Double & Float method parameters execution when called in C#在 C# 中调用时执行 Double & Float 方法参数
【发布时间】:2009-10-12 22:14:27
【问题描述】:

这是一小段 sn-p 代码,当它被调用时,它会输出“double”。为什么?这背后的原因是什么。为什么不打印'float'?

class source
{

    static void Main()
    {
        Receiver r = new Receiver();


        r.Method1(1.1);
    }

}

class Receiver
{
    public virtual void Method1(double f) { Debug.Print("double"); }
    public virtual void Method1(float f) { Debug.Print("float"); }
}

TIA

【问题讨论】:

  • 知道了,谢谢大佬们的指教
  • 这也可能与缩小和扩大转换有关,并且安全默认为双倍
  • "double" 是默认值的原因是因为 (1) double 远非常精确,并且 (2) double 几乎从不比 float 慢,有时甚至更快。为什么更快?因为进行浮点运算的芯片几乎总是以双精度进行所有内部运算;对浮点数的操作需要将浮点数转换为双精度数,以双精度数进行操作,然后在完成后将其改回浮点数。除非你要分配数百万这样的人,否则你几乎肯定不会受到双打的内存限制,所以使用它们而不是浮点数。
  • 太棒了,感谢 eric 的洞察力。

标签: c# parameters floating-point double


【解决方案1】:

要像这样指定浮动调用:

r.Method1(1.1f);

否则它会默认加倍,就像你观察到的那样。

下面是 MSDN documentation 的一部分,解释了原因:

默认情况下,实数 作业的右侧 运算符被视为双精度。

【讨论】:

  • @SoftwareGeek:float 文字 1.1f 实际上表示数量 9,227,469 * 2^(-23),因为所有 float 数字必须表示为范围内值的两倍的幂 (0.. 2^24)。 double 文字 1.1 表示一个分数,其值更接近数学值 11/10。请注意,将双精度值分配给浮点数是一件非常合理的事情,不需要类型转换(但确实如此)。将浮点数分配给双打是狡猾的,应该需要类型转换(但不需要)。
【解决方案2】:

double 是非整数的默认类型。所以 1.1 是双精度数,1.1m 是十进制数,1.1F 是浮点数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-15
    • 1970-01-01
    • 1970-01-01
    • 2018-06-23
    • 2015-07-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多