有效划分

本文关键字:划分 有效 | 更新日期: 2023-09-27 18:37:18

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

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

有效划分

ToString(d/i);//当我这样做时,我能得到什么?双倍?浮子?

你会得到一个双倍。 将双精度除以 int 将得到双精度值。

public String ToString(float? result)//我应该投射什么结果?

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

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

这真的

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


处理此问题的一种干净方法是使用双精度。ToString("N2"),即:

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

如果需要完整的格式化字符串,可以使用:

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

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

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

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

我建议看看微观优化的悲剧,而不是编码恐怖。

<小时 />

至于功能。这是完全没有必要的。您最好的选择是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);

Hacky 解决方案:

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

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

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

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