截断圆角双精度是否安全?

时间:2018-04-05 09:54:03

标签: .net rounding truncate

Math.Round(myDouble)会返回一个浮点double,众所周知,double的精度有限。因此,Math.Round可能会返回比我们寻找的真实整数值稍大的的值。

如果它返回稍大的值,则将结果转换为int是安全的。例如:

Math.Round(19.5) -> 20.0000000000002 -> (int)20.0000000000002 -> 20

但是如果它返回稍微小一点的值,那么将结果转换为int是安全的。例如:

Math.Round(19.5) -> 19.9999999999998 -> (int)19.9999999999998 -> 19

这是正确的推理吗? Math.Round的结果转换为整数是否始终不安全?

或换句话说,这会......

public static int ConvertToInt(double val)
{
    return (int)Math.Round(val, 0, MidpointRounding.AwayFromZero);
}

...永远不会返回与此不同的价值......

public static int ConvertToInt(double val)
{
    return Convert.ToInt32(Math.Round(val, 0, MidpointRounding.AwayFromZero));
}

0 个答案:

没有答案