【问题标题】:dividing efficiently有效划分
【发布时间】:2012-06-16 00:19:42
【问题描述】:

我想将一个双精度类型的数字除以一个整数。我只需要字符串格式的 2 个 deicmal 位置的结果。就堆栈效率而言,最好的方法是什么?

double d=321321321313131233213213213213;
int i=123;

ToString(d/i); //what do I get when I do this? A double? A float?

       public String ToString(float? result) //what should I cast the result?
        {
            return @String.Format("{0:#,0.##;} divided double by int", result);
        }

【问题讨论】:

  • 和函数名前面的 `@~ 在 C# 中没有任何作用。它应该会引发编译器错误。
  • 请去掉标题前的“C#”。请参阅“Stack Overflow is not in need of your SEO skills”。
  • @Cole,这是不真实的。这里是不必要的。但这是合法的。 (需要明确的是,@ 允许您使用 -- 作为 标识符 -- 否则会是保留字。方法名称是标识符)
  • 是的,很好发现。完全没有必要,甚至认为是合法的。剃刀错误的代码端口。

标签: c# division


【解决方案1】:

ToString(d/i); //当我这样做时我会得到什么?双标?浮点数?

你会得到一个双倍的。将 double 除以 int 将产生 double 值。

public String ToString(float?result) //我应该怎样转换结果?

你会得到一个double 的值,所以你最好在这里使用double。你永远不会得到一个可为空的类型,因此肯定不会得到一个float,所以使用float? 是完全不合适的。

就堆栈效率而言,最好的方法是什么?

这真的不值得担心,当然,除非你分析并发现这确实是个问题。构建字符串将比除法操作昂贵得多,而且两者都不太可能成为性能热点。


处理这个问题的一个干净的方法就是使用double.ToString("N2"),即:

double result = d/i;
string resultAsString = result.ToString("N2");

如果你想要一个完整的、格式化的字符串,你可以使用:

string resultAsString = string.Format("{0:N2} divided double by int", result);

【讨论】:

    【解决方案2】:

    好的。首先,你会得到doublenot double?float?。数学函数应该从不返回可为空的类型。如果您假设无穷大表示为null,那您就错了。无穷大由位确定。您可以使用Double.IsInfinity(double) 查看双精度数是否为无穷大。

    [SecuritySafeCritical]
    public static unsafe bool IsInfinity(double d)
    {
        return ((*(((long*) &d)) & 0x7fffffffffffffffL) == 0x7ff0000000000000L);
    }
    

    就堆栈效率而言,最好的方法是什么?

    我建议在 Coding Horror 上查看 tragedies of micro optimization


    至于功能。这是完全没有必要的。你最好的选择是Double.ToString(...):

    double val = d / i;
    string result = val.ToString("N2");
    

    但是,如果您使用的是String.Format(...),则可以使用:

    double val = d / i;
    string result = string.Format("{0:N2} divided double by int", val);
    

    【讨论】:

    • 仅供参考 - 不需要强制转换 - 在这种情况下,Int32 将自动加宽为 Double。
    • @ReedCopsey 嗯。当我执行float * int 时,我的应用程序在我投射之前得到了 0。
    • Cole:C# 语言规范,“7.3.6.2 二进制数字提升”处理此问题 -“如果任一操作数为 double 类型,则另一个操作数将转换为 double 类型。” (先是十进制,然后是双精度,然后是浮点数)
    • 只有在您尝试使用 decimal*doubledecimal*float 或使用 ulong 和“较小”整数类型时才需要强制转换。
    【解决方案3】:

    黑客解决方案:

    如果你只需要 2 位小数,你可以将你的 double 乘以 100,将其转换为整数,然后除以 i

    现在获取结果的字符串,并在最后两个字符前添加一个点。

    不要忘记处理负值和舍入问题的边缘情况。

    如果您真的关心效率,那么与整数除法相比,分数除法是一个缓慢的过程。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-17
      • 2021-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多