public Decimal128 subtractDestructive(Decimal128 right, short scale) {
    this.changeScaleDestructive(scale);
    if (right.signum == 0) {
      return this;
    }
    if (this.signum == 0) {
      this.update(right);
      this.changeScaleDestructive(scale);
      this.negateDestructive();
      return this;
    }

    short rightScaleTen = (short) (scale - right.scale);
    if (this.signum != right.signum) {

      // if different sign, just add up the absolute values
      this.unscaledValue.addDestructiveScaleTen(right.unscaledValue,
          rightScaleTen);
    } else {
      byte cmp = UnsignedInt128.differenceScaleTen(this.unscaledValue,
          right.unscaledValue, this.unscaledValue, rightScaleTen);
      if (cmp == 0) {
        this.signum = 0;
      } else if (cmp < 0) {

        // right's signum wins (notice the negation, because we are
        // subtracting right)
        this.signum = (byte) -right.signum;
      }

      // if left's signum wins, we don't need to do anything
    }

    this.unscaledValue.throwIfExceedsTenToThirtyEight();
    return this;
  }
Calculates subtraction and stores the result into this object. This method
is destructive.
<p>
Unchecked exceptions: ArithmeticException an invalid scale is specified or
overflow.
</p>

@param right
         right operand
@param scale
         scale of the result. must be 0 or positive.
common/src/java/org/apache/hadoop/hive/common/type/Decimal128.java