在这种情况下,我应该如何围绕浮子?

时间:2012-03-30 13:23:22

标签: c# floating-point floating-accuracy

我的代码中存在问题,因为相同的浮点数可以有多个表示形式。 例如,这些数字被认为是相同的:

  • 0.0299999400
  • 0.0300000000

我不太关心一个大的精度,我需要计算这些数字的 CRC 它们应该是相同的,所以我的方法是使用这个代码:

private static float Rounding(float v, float p)
{
    return Mathf.Round (v * p) / p; 
}

p 是我的精确度。

这似乎运作良好,但在这种情况下,如果我使用 p = 1e7 ,第一个数字乘法将导致 299999.4 并四舍五入到 299999 ,变为 0.0299999 ,而 0.03 将保持 0.03 。那是我的问题。

我做对了吗?也许答案是我不能使用 p 这个大,但我不知道浮点数是如何工作的,所以我不知道 p 的大小在所有情况下工作。

但是,我知道我的浮点值位于一个不如浮点范围(±1.5e-45到±3.4e38)的范围内。我的意思是,如果我知道我的花车范围是[-100; + 100],我可以假设 p 有足够的十进制数字为 3 。是吗?

还有其他办法吗?

2 个答案:

答案 0 :(得分:4)

您应该将数字转换为decimal,然后将round转换为所需的精度。 decimals准确无误,因此您可以将它们转换为字符串和哈希而不会出现任何此类问题。

答案 1 :(得分:0)

我不知道我是否帮助你,但如果你需要将这两个数字视为相等,你可以使用:

Math.Round(Convert.ToDecimal((float)0.0299999400),2); //result is 0.03
Math.Round(Convert.ToDecimal((float)0.0300000000),2); //result is 0.03

你有它。如果你想将你的数字四舍五入到1e7的精度,那么当然这两个数字会有所不同。