docs: protected final Value decodeNumberLax(boolean minus) {
          char[] array = charArray;
  
          final int startIndex = __index;
          int index = __index;
          char currentChar;
          boolean doubleFloat = false;
          boolean foundDot = false;
          boolean foundSign = false;
          boolean foundExp = false;
  
          if (minus && index + 1 < array.length) {
              index++;
          }
  
          while (true) {
              currentChar = array[index];
              if (isNumberDigit(currentChar)) {
                  //noop
              } else if (currentChar <= 32) { //white
                  break;
              } else if (isDelimiter(currentChar)) {
                  break;
              } else if (isDecimalChar(currentChar)) {
                  switch (currentChar) {
                      case DECIMAL_POINT:
                          if (foundDot || foundExp) { return decodeStringLax(); }
                          foundDot = true;
                          break;
                      case LETTER_E:
                      case LETTER_BIG_E:
                          if (foundExp) { return decodeStringLax(); }
                          foundExp = true;
                          break;
                      case MINUS:
                      case PLUS:
                          if (foundSign || !foundExp) { return decodeStringLax(); }
                          if (foundExp && array[index - 1] != LETTER_E && array[index - 1] != LETTER_BIG_E) {
                              return decodeStringLax();
                          }
                          foundSign = true;
                          break;
                  }
                  doubleFloat = true;
              } else {
                  return decodeStringLax();
              }
              index++;
              if (index >= array.length) break;
          }
  
          // Handle the case where the exponential number ends without the actual exponent
          if (foundExp) {
              char prevChar = array[index - 1];
              if (prevChar == LETTER_E || prevChar == LETTER_BIG_E || prevChar == MINUS || prevChar == PLUS) {
                  return decodeStringLax();
              }
          }
  
          __index = index;
          __currentChar = currentChar;
  
          Type type = doubleFloat ? Type.DOUBLE : Type.INTEGER;
  
          return new NumberValue(chop, type, startIndex, __index, this.charArray);
      }