【发布时间】:2012-03-30 13:23:22
【问题描述】:
由于同一个浮点数可以具有多种表示形式,我的代码中存在问题。 例如,这些数字被认为是相同的:
- 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。对吗?
还有其他方法吗?
【问题讨论】:
-
知道范围并不能告诉您精度。单精度浮点的精度约为 7 位小数。
-
@user92546 所以,知道范围不会让我知道小数点后有多少位?
-
您知道范围远远超过 10^30。这无法告诉您对于大于 10^8 的数字,您无法控制小数点右侧的任何内容。一些双精度格式提供相同的范围,但比单精度格式更高。其他的则以相同的精度提供更大的范围。你不能教 32 位做 256 的工作。
标签: c# floating-point floating-accuracy