func (a uint128T) divBy10() uint128T {
	q := a.shr(1).add(a.shr(2))
	q = q.add(q.shr(4))
	q = q.add(q.shr(8))
	q = q.add(q.shr(16))
	q = q.add(q.shr(32))
	q = q.add(q.shr(64))
	q = q.shr(3)
	r := a.sub(q.mulBy10())
	return q.add(uint128T{(r.lo + 6) >> 4, 0})
}
See http://www.hackersdelight.org/divcMore.pdf for div-by-const tricks.
package decimal
import (
	"math/bits"
)
type uint128T struct {
	lo, hi uint64
}
func (a uint128T) numDecimalDigits() int {
	bitSize := 129 - a.leadingZeros()
	numDigits := int(bitSize * 3 / 10)
	if a.lt(powerOfTen128(numDigits)) {
		return numDigits
	}
	return numDigits + 1
}
func powerOfTen128(n int) uint128T {
	if n < 0 {
		n = -n
	}
	if n > 19 {
		return umul64(powersOf10[19], powersOf10[n-19])
	}
	return uint128T{powersOf10[n], 0}
}
func umul64(a, b uint64) uint128T {
	var n uint128T
	n.hi, n.lo = bits.Mul64(a, b)
	return n
}
func (a uint128T) add(b uint128T) uint128T {
	lo, carry := bits.Add64(a.lo, b.lo, 0)
	hi, _ := bits.Add64(a.hi, b.hi, carry)
	return uint128T{lo, hi}
}
func (a uint128T) bitLen() uint {
	return 128 - a.leadingZeros()
}
func (a uint128T) div64(d uint64) uint128T {
	q, _ := a.divrem64(d)
	return q
}
func (a uint128T) divrem64(d uint64) (q uint128T, r uint64) {
	r = 0
	q.hi, r = bits.Div64(r, a.hi, d)
	q.lo, r = bits.Div64(r, a.lo, d)
	return
}