我是否正确地假设这种情况:
double d = 3.76212; // d >= 0 && d <= Int32.MaxValue
应该总是使用它:
double truncated = (double)(int)d;
而不是其中任何一个:
double truncated = Math.Truncate(d); // 4 times slower than (double)(int) on x86, 7 times slower than (double)(int) on x64
double truncated = Math.Floor(d); // 3 times slower than (double)(int) on both x86 and x64
换句话说,只有在处理足够大的数字(&gt; x86上的Int32.MaxValue和&gt; Int64.MaxValue onx64)时,或者处理数字时,才会使用Math.Floor。 0因为Floor的行为与负数不同?至于Truncate,它的使用应该是有限的(没有真正适合Int32或Int64的大负数),因为它在所有情况下都比Floor慢?
答案 0 :(得分:0)
我认为在框架的未来版本或CLR的未来版本中,我们不能认为这将永远如此。
您可以做的是创建一个您调用的简单帮助程序类,并隐藏该类中的实现细节。然后,当出现新的CLR / Framework时,您可以重新进行测量并在需要时更新帮助程序类:
double truncated = FastMath.Truncate(d);
并按照
的方式实施public static double Truncate(double d)
{
if ((d >= Int32.MinValue) && (d <= Int32.MaxValue))
{
...
}
}