Способы округления числа с плавающей точкой с правилом 0.5 - PullRequest
3 голосов
/ 25 июля 2011

Я не могу добиться округления числа с плавающей точкой с помощью общего правила 0.5.
Давайте будем точными ... Как я могу сделать такие раунды:

  • x.x2 -> xx
  • x.x5 -> xx (или x.x + 1 тоже подойдет)
  • x.x6 -> x.x + 1

Так, например:

  • 1,12 -> 1,1
  • 1,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 или плохо округленные (слишком высокие, низкие или четные числа, когда округленное число должно стоять на верхнем).

Ответы [ 2 ]

7 голосов
/ 25 июля 2011

Попробуйте это:

round(x * 10.0f) / 10.0f
0 голосов
/ 29 января 2016

Чтобы избежать переполнения в @ 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;
}
...