使用 0.5 规则舍入浮点数的方法
Posted
技术标签:
【中文标题】使用 0.5 规则舍入浮点数的方法【英文标题】:Ways to round a float number with the 0.5 rule 【发布时间】:2011-07-25 01:12:09 【问题描述】:我无法使用常见的 0.5 规则实现浮点数的舍入。 让我们准确点......我怎么能做这样的回合:
x.x2 -> x.x x.x5 -> x.x(或者 x.x+1 也可以) x.x6 -> x.x+1例如:
1.12 -> 1.11.22 -> 1.2
1.15 -> 1.1(或 1.2 也不错)
1.25 -> 1.2(或 1.3 也不错)
1.16 -> 1.2
1.26 -> 1.3我尝试了这些方法(可能是错误的方式):
NSNumberFormatter NSDecimalNumber ...但没有什么能给出这样的结果。我总是得到一些 x.x99999999 的结果,或者是四舍五入的结果(太高、太低,或者在四舍五入的数字应该在上面的时候出现在偶数上)。
【问题讨论】:
既然你提到了x.x99999999
结果,你可以尝试使用%.1f
格式化printf
。
迈克说了什么;听起来像是经典的“浮点数以 2 为底而不是以 10 为底”的问题。
顺便说一句,“当四舍五入的数字应该放在上面的时候,偶数”是通常的做法,这样四舍五入不会对一系列数字的平均值产生小的正向偏移. (例如,由于 x = 0.0 不四舍五入,0.0
@Mike DeSimone:没错,但据我所知,这在大型系统中并不常见。
【参考方案1】:
试试这个:
round(x * 10.0f) / 10.0f
【讨论】:
【参考方案2】:为避免@junjanes 的好答案溢出,请仅在x
有小数部分时对其进行操作。
float round_tenth(float x)
const float limit = 1.0/FLT_EPSILON;
// or limit = FLT_MAX/10.0;
if (fabsf(x) < limit)
return roundf(x*10.0f)/10.0f;
return x;
【讨论】:
以上是关于使用 0.5 规则舍入浮点数的方法的主要内容,如果未能解决你的问题,请参考以下文章