code: public DateTimeFormatterBuilder appendFraction(
              TemporalField field, int minWidth, int maxWidth, boolean decimalPoint) {
          appendInternal(new FractionPrinterParser(field, minWidth, maxWidth, decimalPoint));
          return this;
      }
docs: Appends the fractional value of a date-time field to the formatter.
  <p>
  The fractional value of the field will be output including the
  preceding decimal point. The preceding value is not output.
  For example, the second-of-minute value of 15 would be output as {@code .25}.
  <p>
  The width of the printed fraction can be controlled. Setting the
  minimum width to zero will cause no output to be generated.
  The printed fraction will have the minimum width necessary between
  the minimum and maximum widths - trailing zeroes are omitted.
  No rounding occurs due to the maximum width - digits are simply dropped.
  <p>
  When parsing in strict mode, the number of parsed digits must be between
  the minimum and maximum width. When parsing in lenient mode, the minimum
  width is considered to be zero and the maximum is nine.
  <p>
  If the value cannot be obtained then an exception will be thrown.
  If the value is negative an exception will be thrown.
  If the field does not have a fixed set of valid values then an
  exception will be thrown.
  If the field value in the date-time to be printed is invalid it
  cannot be printed and an exception will be thrown.
  
  @param field  the field to append, not null
  @param minWidth  the minimum width of the field excluding the decimal point, from 0 to 9
  @param maxWidth  the maximum width of the field excluding the decimal point, from 1 to 9
  @param decimalPoint  whether to output the localized decimal point symbol
  @return this, for chaining, not null
  @throws IllegalArgumentException if the field has a variable set of valid values or
  either width is invalid