2

我想在 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

我知道我可以将值转换为十进制,然后最后转换为浮点数以获得正确的结果,如下所示:

public float Frac(float value)
{
   return (float)((decimal)value - Decimal.Truncate((decimal)value));
}

但我想知道是否有更好的方法而不使用小数......

4

2 回答 2

2

float(System.Single 的别名)仅精确到 7 位。无论如何,您不应该真正使用相等来比较浮点值。相反,您应该检查它们是否在可容忍的范围内 - 例如,预期值和实际值之间的差异不超过 0.000001。

Assert.AreEqual(expected, actual, delta);

如果您使用double代替,您将精确到 15-16 位。

于 2010-06-16T07:55:06.787 回答
0

您将需要使用小数,如:

public decimal Frac(decimal value) { return value - Math.Truncate(value); }

所以,当你通过 2.6m 时,你总是会得到 0.6

于 2010-06-16T07:57:24.513 回答