1

我想用一个 int 来划分一些 double 类型。我只需要字符串格式的 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);
        }
4

3 回答 3

5

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

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

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

你会得到 adouble的价值,所以你最好在double这里使用 a 。你永远不会得到一个可以为空的类型,也绝对不会得到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);
于 2012-06-16T00:23:41.587 回答
2

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

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

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

我建议在 Coding Horror 上看看微优化的悲剧。


至于功能。这是完全没有必要的。你最好的选择是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);
于 2012-06-16T00:23:06.260 回答
-1

哈克解决方案:

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

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

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

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

于 2012-06-16T00:33:02.770 回答