private String toDecimalString()
  {
	final int estimatedViewLength = Math.max(21, factor + 3);
	final char[] buff = new char[estimatedViewLength];
	int bufPos = estimatedViewLength;
	long abase = Math.abs(base);
	int wfactor = factor;
	do
	{
	  final long r = abase % 10;
	  buff[--bufPos] = (char) ('0' + r);
	  abase = abase / 10;
	  if (wfactor > 0)
	  {
		wfactor--;
		if (wfactor == 0)
		{
		  buff[--bufPos] = '.';
		  if (abase == 0)
		  {
			buff[--bufPos] = '0';
		  }
		}
	  }
	}
	while (abase != 0);
	if (wfactor > 0)
	{
	  while (wfactor > 0)
	  {
		buff[--bufPos] = '0';
		wfactor--;
	  }
	  buff[--bufPos] = '.';
	  buff[--bufPos] = '0';
	}
	if (base < 0)
	{
	  buff[--bufPos] = '-';
	}
	return new String(buff, bufPos, buff.length - bufPos);
  }