Proposal: Make the display of decimal ranks more directly understandable

The current display of decimal ranks in user profiles (e.g., 3.1k) is confusing for many users. This is for instance apparent in a discussion on this topic on the forum, at What rating value can be considered the "middle" of the rank?.

This proposal is to update the display of decimal ranks so as to more directly match the underlying rank/rating of users.

Specifically, following this update, the displayed decimal rank would always match the user’s integer rank transparently. For instance, a 3k player would have a decimal rank between 3.0k and 3.9k, with 3.0k being on the strong end of 3k and the closest to 2.9k/2k, and 3.9k closest to 4.0k/4k.

Confusingly, this is not the case in the current system. The 3.1k rating mentioned above actually corresponds to a 4k player, and some players have weird ratings like 0.7k (in fact, most 1k players do). Also, for a given rank, the integer part of the decimal rank spans two integers (4.0k is 4k, and 3.1k is also 4k), which seems somewhat inconsistent especially if 4.0 isn’t the center of the interval. Why ranks are currently shown like they are has to do with how they exist internally within the codebase, which IMO isn’t relevant from a user interface perspective so I won’t go into the details. This proposal is to adjust the display of decimal kyu ranks to make them behave as described above.

Importantly, no change is needed for dan users because an adjustment similar to the one proposed here is already in place (so even now a 1.9d player is indeed a 1d close to 2.0d/2d, and you cannot be 0.7d).

To move to the behavior described above, the displayed decimal kyu ranks need to be bumped by 0.9 (so that for instance a strong 4k player would display as 4.0k instead of the current 3.1k).

The proposal is simple code-wise and already exists as a pull request, but as the change would be very noticeable to many users initially, we would like to have a discussion on the matter and see the feedback of the community before actually updating anything.

To clarify:

  • This change would only impact the display of decimal ranks in user profiles (for instance, 3.2k): actual ranks (for instance, 4k) and ratings will remain the same before and after.
  • This change would not impact dan users as a similar correction is already in place.

The decimal ratings more precisely reflect the rating points. It has always been understood that these are rounded up at the kyu level and down at the dan level for the sake of the integer ranks.

I’m completely confused by your proposal because you don’t give a precise example of what ranks would look like after your proposal is implemented.

1 Like

I think the idea is to add 0.9 to all displayed decimal kyu ranks.

So a 1k who is a decimal 0.3k would become 1.2k instead.

A 5k who is a decimal 5.0k would become 5.9k, etc.

1 Like

If that is true, then I think it is a horrible proposal, because it completely, and arbitrarily, misrepresents the rating points. A 5.0k really is 5.0 in terms of rating points; they are not 5.9.


What do 5.0 and 5.9 mean? You (and I as well) may be used to the status quo but there is no set in stone idea of what these numbers mean. Neither is there a long tradition of how decimal ranks should be interpreted.

Should 4.2 be a 4kyu approaching 3kyu, or a 5kyu approaching 4kyu? OGS currently interprets as the latter but OP suggests the former. I think OP’s proposal is fair, and the main argument against is inertia - people are used to the current system and a change will inevitably cause some gripes and confusion.


If the aim is to unify the tenths precision rank (e.g. 3.1k) with the ones precision rank (e.g. 4k), it makes more sense to me to update how we derive the ones precision number.

In other words, replace:

ones =  ceil(true_rank)


ones = floor(true_rank)

No more “magic number” 0.9.

But these are all implementation details anyway. As @mafidufa hinted at, that the real source of truth is Glicko, so we can really transform to k/d however we like


Will that make dan ranks now show the same problem? Because of the jump from 1kyu to 1dan and skipping zero.


Oh yeah I think you’re right. Funny how 0.1k makes sense, but 0k doesn’t :sweat_smile:


Actually removing the use of ceil() and standardizing to floor() was my original idea but I had to revert that code after some unintended side effects/issues started appearing. In particular, some interface-related user profile objects keep track of the user’s rank in integer form, so the 29.0 OGS rank (that’s -1.0, if you want to center on 0.0) needs to still correspond to 1k users. Code-wise we need to keep the left-closed right-open [29.0, 30.0[ interval (or [-1.0, 0.0[ if centered) for the 1k rank, and so on for 2k, 3k etc; it’s hard to change the flooring approach.

The 0.9 is weird, but it’s actually +1.0 (move away from 0, to have ranks start at 1.0, like for dans) and then -0.1 (to account for the use of ceil rather than floor, on 1-digit precision numbers).


That skip is already present in the current system, though. And it doesn’t bother people, with many even thinking it’s not there! You go from 0.1k (-0.1) to 1.0d (+1.0).

If the system was consistent between kyu and dan, 1d users would have ranks in 0.x (then you’d go from -0.1, strong 1k) to 0.0d (weak 1d), but then 1.x ranks would be 2d users, etc. It’s just too obvious that it’s a bad idea so on the dan side the display was adjusted long ago.

In the proposal you go from 1.0k (strongest possible 1k, and strongest possible kyu) to 1.0d (weakest possible 1d, and weakest possible dan). Both the kyu and the dan scales start at 1, going in opposite directions. It’s just how the kyu/dan system is defined, decimal or not.


Or just avoid all confusion and don’t display decimals for ranks.
If someone asks your rank, would your response include decimals?


No but you know it’s like my age is 3 years and an half or like i am almost 5k…


Without the decimals, handicaps (which are based on the full non-rounded value) are much harder to understand.


I think the decimals are useful when you’re looking at the rank over time (like on the profile page). It offers the precision of Elo, but the anchoring of kyu/dan


Sure, but that is relatively easy to understand, while I wouldn’t understand at first glance what 3.2k is supposed to mean. Does it mean weak 3k, or does it mean almost 3k (so actually strong 4k)?

Is that what this topic is about: how representations like 3.2k should be interpreted?


Yes true, and that’s mostly because first decreasing then increasing and that hole at 1k-1d.
Imho there are no easy way besides mentioning all the details each time which is heavy.

At least the documentation/FAQ should have a complete explaination for who wants to understand.

Now if i read 3.2 that means to me
The integer part is the level (3)
The decimal is that i m near 2k (0.3 far from it)
I ll become weak 2k at 2.9

But i guess i may be completly wrong :joy:

It could be that 3 be the center, 2.9 to 2.5 a strong 3k and 3.4 to 3.1 a weak.
I like it less because i like the integer part to be the level.

1 Like

So then 3.0k would mean strong 3k and 3.9k would mean weak 3k.

I m following a decreasing ladder in which each integer covers a rank.

Things have to be fixed (and explained) somewhere because logic varies a lot between people. Some would like to go from a weak 3k to a strong 3.9k then jump back to 2k etc… Even more complex to put 3k at the middle. All is valid the problem is to select and explain which one.

See, even here I’m confused on the logic you use (which stand completly valid anyway)

So it seems you agree with OP proposal where 3.2k would be a stronger 3k (let’s call it system A).

My initial uninformed interpretation was that 3.2k might mean weaker 3k (let’s call it system B).

Currently (as in the current implementation on OGS) 3.2k seems to mean stronger 4k (let’s call it system C).

In short:

  • in system A, 3.0k means strongest 3k
  • in system B, 3.0k means average 3k
  • in system C, 3.0k means weakest 3k

Kyu rank ranges:

  • in system A, 3k ranges from 3.9k (weak) to 3.0k (strong)
  • in system B, 3k ranges from 3.5k (weak) to 2.6k (strong)
  • in system C, 3k ranges from 3.0k (weak) to 2.1k (strong)

Dan rank ranges:

  • in system A, 3d ranges from 3.0d (weak) to 3.9d (strong)
  • in system B, 3d ranges from 2.5d (weak) to 3.4d (strong)
  • in system C, 3d ranges from 3.0d (weak) to 3.9d (strong)

Kyu/dan boundary:

  • in system A, the strongest kyu rank is 1.0k and the weakest dan rank is 1.0d
  • in system B, the strongest kyu rank is 0.6k and the weakest dan rank is 0.5d
  • in system C, the strongest kyu rank is 0.1k and the weakest dan rank is 1.0d

In system A there is potential ambiguity when the rating falls exactly on the kyu/dan boundary. This should be exceedingly rare, but I guess the system could just arbitrarily pick either dan or kyu label.

We can poll people’s preference I guess.

Which system makes most sense to you?
  • System A
  • System B
  • System C
0 voters

I feel like I need to mention…