📄 sqldouble.java
字号:
} /** Called for an application setting this value using a BigDecimal */ public void setBigDecimal(Number bigDecimal) throws StandardException { if (objectNull(bigDecimal)) return; // Note BigDecimal.doubleValue() handles the case where // its value is outside the range of a double. It returns // infinity values which should throw an exception in setValue(double). setValue(bigDecimal.doubleValue()); } /** * @see NumberDataValue#setValue * */ public void setValue(boolean theValue) { value = theValue?1:0; isnull = false; } /* * DataValueDescriptor interface */ /** @see DataValueDescriptor#typePrecedence */ public int typePrecedence() { return TypeId.DOUBLE_PRECEDENCE; } /* ** SQL Operators */ /** * The = operator as called from the language module, as opposed to * the storage module. * * @param left The value on the left side of the = * @param right The value on the right side of the = * is not. * * @return A SQL boolean value telling whether the two parameters are equal * * @exception StandardException Thrown on error */ public BooleanDataValue equals(DataValueDescriptor left, DataValueDescriptor right) throws StandardException { return SQLBoolean.truthValue(left, right, left.getDouble() == right.getDouble()); } /** * The <> operator as called from the language module, as opposed to * the storage module. * * @param left The value on the left side of the <> * @param right The value on the right side of the <> * is not. * * @return A SQL boolean value telling whether the two parameters * are not equal * * @exception StandardException Thrown on error */ public BooleanDataValue notEquals(DataValueDescriptor left, DataValueDescriptor right) throws StandardException { return SQLBoolean.truthValue(left, right, left.getDouble() != right.getDouble()); } /** * The < operator as called from the language module, as opposed to * the storage module. * * @param left The value on the left side of the < * @param right The value on the right side of the < * * @return A SQL boolean value telling whether the first operand is less * than the second operand * * @exception StandardException Thrown on error */ public BooleanDataValue lessThan(DataValueDescriptor left, DataValueDescriptor right) throws StandardException { return SQLBoolean.truthValue(left, right, left.getDouble() < right.getDouble()); } /** * The > operator as called from the language module, as opposed to * the storage module. * * @param left The value on the left side of the > * @param right The value on the right side of the > * * @return A SQL boolean value telling whether the first operand is greater * than the second operand * * @exception StandardException Thrown on error */ public BooleanDataValue greaterThan(DataValueDescriptor left, DataValueDescriptor right) throws StandardException { return SQLBoolean.truthValue(left, right, left.getDouble() > right.getDouble()); } /** * The <= operator as called from the language module, as opposed to * the storage module. * * @param left The value on the left side of the <= * @param right The value on the right side of the <= * * @return A SQL boolean value telling whether the first operand is less * than or equal to the second operand * * @exception StandardException Thrown on error */ public BooleanDataValue lessOrEquals(DataValueDescriptor left, DataValueDescriptor right) throws StandardException { return SQLBoolean.truthValue(left, right, left.getDouble() <= right.getDouble()); } /** * The >= operator as called from the language module, as opposed to * the storage module. * * @param left The value on the left side of the >= * @param right The value on the right side of the >= * * @return A SQL boolean value telling whether the first operand is greater * than or equal to the second operand * * @exception StandardException Thrown on error */ public BooleanDataValue greaterOrEquals(DataValueDescriptor left, DataValueDescriptor right) throws StandardException { return SQLBoolean.truthValue(left, right, left.getDouble() >= right.getDouble()); } /** * This method implements the + operator for "double + double". * * @param addend1 One of the addends * @param addend2 The other addend * @param result The result of a previous call to this method, null * if not called yet * * @return A SQLDouble containing the result of the addition * * @exception StandardException Thrown on error */ public NumberDataValue plus(NumberDataValue addend1, NumberDataValue addend2, NumberDataValue result) throws StandardException { if (result == null) { result = new SQLDouble(); } if (addend1.isNull() || addend2.isNull()) { result.setToNull(); return result; } double tmpresult = addend1.getDouble() + addend2.getDouble(); // No need to check underflow (result rounded to 0.0), // since the difference between two non-equal valid DB2 DOUBLE values is always non-zero in java.lang.Double precision. result.setValue(tmpresult); return result; } /** * This method implements the - operator for "double - double". * * @param left The value to be subtracted from * @param right The value to be subtracted * @param result The result of a previous call to this method, null * if not called yet * * @return A SQLDouble containing the result of the subtraction * * @exception StandardException Thrown on error */ public NumberDataValue minus(NumberDataValue left, NumberDataValue right, NumberDataValue result) throws StandardException { if (result == null) { result = new SQLDouble(); } if (left.isNull() || right.isNull()) { result.setToNull(); return result; } double tmpresult = left.getDouble() - right.getDouble(); // No need to check underflow (result rounded to 0.0), // since no difference between two valid DB2 DOUBLE values can be rounded off to 0.0 in java.lang.Double result.setValue(tmpresult); return result; } /** * This method implements the * operator for "double * double". * * @param left The first value to be multiplied * @param right The second value to be multiplied * @param result The result of a previous call to this method, null * if not called yet * * @return A SQLDouble containing the result of the multiplication * * @exception StandardException Thrown on error */ public NumberDataValue times(NumberDataValue left, NumberDataValue right, NumberDataValue result) throws StandardException { if (result == null) { result = new SQLDouble(); } if (left.isNull() || right.isNull()) { result.setToNull(); return result; } double leftValue = left.getDouble(); double rightValue = right.getDouble(); double tempResult = leftValue * rightValue; // check underflow (result rounded to 0.0) if ( (tempResult == 0.0) && ( (leftValue != 0.0) && (rightValue != 0.0) ) ) { throw StandardException.newException(SQLState.LANG_OUTSIDE_RANGE_FOR_DATATYPE, TypeId.DOUBLE_NAME); } result.setValue(tempResult); return result; } /** * This method implements the / operator for "double / double". * * @param dividend The numerator * @param divisor The denominator * @param result The result of a previous call to this method, null * if not called yet * * @return A SQLDouble containing the result of the division * * @exception StandardException Thrown on error */ public NumberDataValue divide(NumberDataValue dividend, NumberDataValue divisor, NumberDataValue result) throws StandardException { if (result == null) { result = new SQLDouble(); } if (dividend.isNull() || divisor.isNull()) { result.setToNull(); return result; } /* ** For double division, we can't catch divide by zero with Double.NaN; ** So we check the divisor before the division. */ double divisorValue = divisor.getDouble(); if (divisorValue == 0.0e0D) { throw StandardException.newException(SQLState.LANG_DIVIDE_BY_ZERO); } double dividendValue = dividend.getDouble(); double divideResult = dividendValue / divisorValue; if (Double.isNaN(divideResult)) { throw StandardException.newException(SQLState.LANG_DIVIDE_BY_ZERO); } // check underflow (result rounded to 0.0d) if ((divideResult == 0.0d) && (dividendValue != 0.0d)) { throw StandardException.newException(SQLState.LANG_OUTSIDE_RANGE_FOR_DATATYPE, TypeId.DOUBLE_NAME); } result.setValue(divideResult); return result; } /** * This method implements the unary minus operator for double. * * @param result The result of a previous call to this method, null * if not called yet * * @return A SQLDouble containing the result of the division * * @exception StandardException Thrown on error */ public NumberDataValue minus(NumberDataValue result) throws StandardException { double minusResult; if (result == null) { result = new SQLDouble(); } if (this.isNull()) { result.setToNull(); return result; } /* ** Doubles are assumed to be symmetric -- that is, their ** smallest negative value is representable as a positive ** value, and vice-versa. */ minusResult = -(this.getDouble()); result.setValue(minusResult); return result; } /** * This method implements the isNegative method. * * @return A boolean. If this.value is negative, return true. * For positive values or null, return false. */ protected boolean isNegative() { return !isNull() && (value < 0.0d); } /* * String display of value */ public String toString() { if (isNull()) return "NULL"; else return Double.toString(value); } /* * Hash code */ public int hashCode() { long longVal = (long) value; double doubleLongVal = (double) longVal; /* ** NOTE: This is coded to work around a bug in Visual Cafe 3.0. ** If longVal is compared directly to value on that platform ** with the JIT enabled, the values will not always compare ** as equal even when they should be equal. This happens with ** the value Long.MAX_VALUE, for example. ** ** Assigning the long value back to a double and then doing ** the comparison works around the bug. ** ** This fixes Cloudscape bug number 1757. ** ** - Jeff Lichtman */ if (doubleLongVal != value) { longVal = Double.doubleToLongBits(value); } return (int) (longVal ^ (longVal >> 32)); } /* * useful constants... */ static final int DOUBLE_LENGTH = 32; // must match the number of bytes written by DataOutput.writeDouble() private static final int BASE_MEMORY_USAGE = ClassSize.estimateBaseFromCatalog( SQLDouble.class); public int estimateMemoryUsage() { return BASE_MEMORY_USAGE; } /* * object state */ private double value; private boolean isnull;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -