bson/src/main/org/bson/types/Decimal128.java
@Override
    public double doubleValue() {
        if (isNaN()) {
            return Double.NaN;
        }
        if (isInfinite()) {
            if (isNegative()) {
                return Double.NEGATIVE_INFINITY;
            } else {
                return Double.POSITIVE_INFINITY;
            }
        }

        BigDecimal bigDecimal = bigDecimalValueNoNegativeZeroCheck();

        if (hasDifferentSign(bigDecimal)) {
            return -0.0d;
        }

        return bigDecimal.doubleValue();
    }
@Override
    public double doubleValue() {
        if (isNaN()) {
            return Double.NaN;
        }
        if (isInfinite()) {
            if (isNegative()) {
                return Double.NEGATIVE_INFINITY;
            } else {
                return Double.POSITIVE_INFINITY;
            }
        }

        BigDecimal bigDecimal = bigDecimalValueNoNegativeZeroCheck();

        if (hasDifferentSign(bigDecimal)) {
            return -0.0d;
        }

        return bigDecimal.doubleValue();
    }
Converts this {@code Decimal128} to a {@code double}. This conversion is similar to the <i>narrowing primitive conversion</i> from
{@code double} to {@code float} as defined in <cite>The Java&trade; Language Specification</cite>: if this {@code Decimal128} has
too great a magnitude to represent as a {@code double}, it will be converted to {@link Double#NEGATIVE_INFINITY} or
{@link Double#POSITIVE_INFINITY} as appropriate.  Note that even when the return value is finite, this conversion can lose
information about the precision of the {@code Decimal128} value. Note that {@code #NEGATIVE_ZERO} is converted to {@code 0.0d}.

@return this {@code Decimal128} converted to a {@code double}.
@since 3.10