I need to encode a BigDecimal compactly into a ByteBuffer to replace my current (rubbish) encoding scheme (writing the BigDecimal as a UTF-8 encoded String prefixed with a byte denoting the String length).
Given that a BigDecimal is effectively an integer value (in the mathematical sense) and an associated scale I am planning to write the scale as a single byte followed by a VLQ encoded integer. This should adequately cover the range of expected values (i.e. max scale 127).
My question: When encountering large values such as 10,000,000,000 it is clearly optimal to encode this as the value: 1 with a scale of -10 rather than encoding the integer 10,000,000,000 with a scale of 0 (which will occupy more bytes). How can I determine the optimal scale for a given BigDecimal? … In other words, how I can determine the minimum possible scale I set assign a BigDecimal without having to perform any rounding?
Please do not reference the term “premature optimisation” in your answers 🙂
BigDecimal#stripTrailingZeros seems to be doing this.