我想在C#中实现一个frac函数(就像hsl中的那个http://msdn.microsoft.com/en-us/library/bb509603%28VS.85%29.aspx)但是因为它适用于处理器密集型应用程序,所以我希望有最好的版本。我正在使用像
这样的东西public float Frac(float value)
{
return value - (float)Math.Truncate(value);
}
但是我遇到精度问题,例如2.6f它在单元测试中返回
预计:0.600000024f但是:0.599999905f
我知道我可以将值转换为十进制,然后在最后转换为float以获得正确的结果,如下所示:
public float Frac(float value)
{
return (float)((decimal)value - Decimal.Truncate((decimal)value));
}
但我想知道是否有更好的方法而不诉诸小数......
答案 0 :(得分:2)
float(System.Single的别名)仅精确到7位数。不管怎么说,你不应该使用相等来比较浮点值。您应该检查它们是否在可容忍的范围内 - 例如,预期值和实际值之间的差异不超过0.000001。
Assert.AreEqual(expected, actual, delta);
如果您改用double,则精确到15-16位。
答案 1 :(得分:0)
您将需要使用小数,如:
public decimal Frac(decimal value) { return value - Math.Truncate(value); }
所以,当你通过2.6米时,总是得到.6