在C#中删除数字的分数值的最快方法

时间:2018-08-06 14:15:09

标签: c# .net

我知道有很多方法可以去除数字的小数位。

例如,如果我有一个变量,类型为double,数字为12.34。 想要将其转换为int,这是我可以做的:

int var = (int)fractionalVar;
int var = (int)Math.Round(fractionalVar);
int var = (int)Math.Truncate(fractionalVar);

所以我的问题是: 哪一个最快或有一个更快?

编辑:我的错,我不是想四舍五入。这就是我的意思: 从数字中删除分数值。 例。 12.34至12以及12.99至12。

2 个答案:

答案 0 :(得分:3)

忽略“最快”的问题-使用Math.Truncate。为什么?因为您的问题基本上是“这是截断最快的方法”。没关系它们都非常快,O(1)。使用最干净的一个。类似于您实际要执行的操作。

也请阅读以下内容: https://blog.codinghorror.com/micro-optimization-and-meatballs/

在旁注RoundTruncate的行为不同。

答案 1 :(得分:1)

由于这三个方法都转换为double,因此调用函数的两个方法将变慢,因为还有更多工作要做。可以使用基准进行确认。

          Method |      N |      Mean |     Error |    StdDev |
---------------- |------- |----------:|----------:|----------:|
    BasicIntCast | 100000 | 0.0001 ns | 0.0002 ns | 0.0002 ns |
    RoundAndCast | 100000 | 0.0514 ns | 0.0064 ns | 0.0056 ns |
 TruncateAndCast | 100000 | 5.4704 ns | 0.0197 ns | 0.0165 ns |

正如其他人提到的那样,您所需的最终结果应确定您使用哪种方法。如果您真的想要例如12.999999 ...变成12,然后将其转换为int即可完成工作。

编辑:还要小心演员身上的溢出!

        double d = 12e25;
        int i = (int)d;
        Console.WriteLine(i);
        // -2147483648