有效地划分

时间:2012-06-16 00:19:42

标签: c# division

我想用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);
        }

3 个答案:

答案 0 :(得分:5)

  

的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);

答案 1 :(得分:2)

确定。首先,您获得double 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);

答案 2 :(得分:-1)

Hacky解决方案:

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

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

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

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