@Test public void testMulitplyBigNumbers() throws Exception { BigDecimal field1 = new BigDecimal( "123456789012345678901.1234567890123456789" ); BigDecimal field2 = new BigDecimal( "1.0" ); BigDecimal field3 = new BigDecimal( "2.0" ); BigDecimal expResult1 = new BigDecimal( "123456789012345678901.1234567890123456789" ); BigDecimal expResult2 = new BigDecimal( "246913578024691357802.2469135780246913578" ); BigDecimal expResult3 = new BigDecimal( "123456789012345678901.1200000000000000000" ); BigDecimal expResult4 = new BigDecimal( "246913578024691357802" ); assertEquals( expResult1, ValueDataUtil.multiplyBigDecimals( field1, field2, null ) ); assertEquals( expResult2, ValueDataUtil.multiplyBigDecimals( field1, field3, null ) ); assertEquals( expResult3, ValueDataUtil.multiplyBigDecimals( field1, field2, new MathContext( 23 ) ) ); assertEquals( expResult4, ValueDataUtil.multiplyBigDecimals( field1, field3, new MathContext( 21 ) ) ); }
/** * A + B * C * * @param metaA * @param dataA * @param metaB * @param dataB * @return * @throws KettleValueException */ public static Object combination1( ValueMetaInterface metaA, Object dataA, ValueMetaInterface metaB, Object dataB, ValueMetaInterface metaC, Object dataC ) throws KettleValueException { if ( dataA == null || dataB == null || dataC == null ) { return null; } switch ( metaA.getType() ) { case ValueMetaInterface.TYPE_NUMBER: return new Double( metaA.getNumber( dataA ).doubleValue() + ( metaB.getNumber( dataB ).doubleValue() * metaC.getNumber( dataC ).doubleValue() ) ); case ValueMetaInterface.TYPE_INTEGER: return new Long( metaA.getInteger( dataA ).longValue() + ( metaB.getInteger( dataB ).longValue() * metaC.getInteger( dataC ).longValue() ) ); case ValueMetaInterface.TYPE_BIGNUMBER: return metaA.getBigNumber( dataA ).add( multiplyBigDecimals( metaB.getBigNumber( dataB ), metaC.getBigNumber( dataC ), null ) ); default: throw new KettleValueException( "The 'combination1' function only works on numeric data" ); } }
/** * A - ( A * B / 100 ) * * @param metaA * @param dataA * @param metaB * @param dataB * @return * @throws KettleValueException */ public static Object percent2( ValueMetaInterface metaA, Object dataA, ValueMetaInterface metaB, Object dataB ) throws KettleValueException { if ( dataA == null || dataB == null ) { return null; } switch ( metaA.getType() ) { case ValueMetaInterface.TYPE_NUMBER: return new Double( metaA.getNumber( dataA ).doubleValue() - divideDoubles( multiplyDoubles( metaA.getNumber( dataA ), metaB.getNumber( dataB ) ), 100.0D ) ); case ValueMetaInterface.TYPE_INTEGER: return new Long( metaA.getInteger( dataA ).longValue() - divideLongs( multiplyLongs( metaA.getInteger( dataA ), metaB.getInteger( dataB ) ), 100L ) ); case ValueMetaInterface.TYPE_BIGNUMBER: return metaA.getBigNumber( dataA ).subtract( divideBigDecimals( multiplyBigDecimals( metaB.getBigNumber( dataB ), metaA.getBigNumber( dataA ), null ), new BigDecimal( 100 ), null ) ); default: throw new KettleValueException( "The 'A-B%' function only works on numeric data" ); } }
/** * A + ( A * B / 100 ) * * @param metaA * @param dataA * @param metaB * @param dataB * @return * @throws KettleValueException */ public static Object percent3( ValueMetaInterface metaA, Object dataA, ValueMetaInterface metaB, Object dataB ) throws KettleValueException { if ( dataA == null || dataB == null ) { return null; } switch ( metaA.getType() ) { case ValueMetaInterface.TYPE_NUMBER: return new Double( metaA.getNumber( dataA ).doubleValue() + divideDoubles( multiplyDoubles( metaA.getNumber( dataA ), metaB.getNumber( dataB ) ), 100.0D ) ); case ValueMetaInterface.TYPE_INTEGER: return new Long( metaA.getInteger( dataA ).longValue() + divideLongs( multiplyLongs( metaA.getInteger( dataA ), metaB.getInteger( dataB ) ), 100L ) ); case ValueMetaInterface.TYPE_BIGNUMBER: return metaA.getBigNumber( dataA ).add( divideBigDecimals( multiplyBigDecimals( metaB.getBigNumber( dataB ), metaA.getBigNumber( dataA ), null ), new BigDecimal( 100 ), null ) ); default: throw new KettleValueException( "The 'A+B%' function only works on numeric data" ); } }
protected static Object multiplyNumeric( ValueMetaInterface metaA, Object dataA, ValueMetaInterface metaB, Object dataB ) throws KettleValueException { switch ( metaA.getType() ) { case ValueMetaInterface.TYPE_NUMBER: return multiplyDoubles( metaA.getNumber( dataA ), metaB.getNumber( dataB ) ); case ValueMetaInterface.TYPE_INTEGER: return multiplyLongs( metaA.getInteger( dataA ), metaB.getInteger( dataB ) ); case ValueMetaInterface.TYPE_BIGNUMBER: return multiplyBigDecimals( metaA.getBigNumber( dataA ), metaB.getBigNumber( dataB ), null ); default: throw new KettleValueException( "The 'multiply' function only works on numeric data optionally multiplying strings." ); } }
/** * 100 * A / B * * @param metaA * @param dataA * @param metaB * @param dataB * @return * @throws KettleValueException */ public static Object percent1( ValueMetaInterface metaA, Object dataA, ValueMetaInterface metaB, Object dataB ) throws KettleValueException { if ( dataA == null || dataB == null ) { return null; } switch ( metaA.getType() ) { case ValueMetaInterface.TYPE_NUMBER: return divideDoubles( multiplyDoubles( 100.0D, metaA.getNumber( dataA ) ), metaB.getNumber( dataB ) ); case ValueMetaInterface.TYPE_INTEGER: return divideLongs( multiplyLongs( 100L, metaA.getInteger( dataA ) ), metaB.getInteger( dataB ) ); case ValueMetaInterface.TYPE_BIGNUMBER: return divideBigDecimals( multiplyBigDecimals( metaA.getBigNumber( dataA ), new BigDecimal( 100 ), null ), metaB .getBigNumber( dataB ), null ); default: throw new KettleValueException( "The 'A/B in %' function only works on numeric data" ); } }
} else if ( isBigNumber() || v.isBigNumber() ) { setValue( ValueDataUtil.multiplyBigDecimals( getBigNumber(), v.getBigNumber(), null ) ); } else if ( isNumber() || v.isNumber() ) {