Scale numbers to be <= 255?

前端 未结 13 2219
生来不讨喜
生来不讨喜 2021-02-05 18:39

I have cells for whom the numeric value can be anything between 0 and Integer.MAX_VALUE. I would like to color code these cells correspondingly.

If the val

13条回答
  •  悲&欢浪女
    2021-02-05 19:16

    The "fairest" linear scaling is actually done like this:

    floor(256 * value / (Integer.MAX_VALUE + 1))
    

    Note that this is just pseudocode and assumes floating-point calculations.

    If we assume that Integer.MAX_VALUE + 1 is 2^31, and that / will give us integer division, then it simplifies to

    value / 8388608
    

    Why other answers are wrong

    Some answers (as well as the question itself) suggsted a variation of (255 * value / Integer.MAX_VALUE). Presumably this has to be converted to an integer, either using round() or floor().

    If using floor(), the only value that produces 255 is Integer.MAX_VALUE itself. This distribution is uneven.

    If using round(), 0 and 255 will each get hit half as many times as 1-254. Also uneven.

    Using the scaling method I mention above, no such problem occurs.

    Non-linear methods

    If you want to use logs, try this:

    255 * log(value + 1) / log(Integer.MAX_VALUE + 1)
    

    You could also just take the square root of the value (this wouldn't go all the way to 255, but you could scale it up if you wanted to).

提交回复
热议问题