@Test public void testDivisionBigNumbers() 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( "61728394506172839450.56172839450617283945" ); BigDecimal expResult3 = new BigDecimal( "123456789012345678901.12" ); BigDecimal expResult4 = new BigDecimal( "61728394506172839450.6" ); assertEquals( expResult1, ValueDataUtil.divideBigDecimals( field1, field2, null ) ); assertEquals( expResult2, ValueDataUtil.divideBigDecimals( field1, field3, null ) ); assertEquals( expResult3, ValueDataUtil.divideBigDecimals( field1, field2, new MathContext( 23 ) ) ); assertEquals( expResult4, ValueDataUtil.divideBigDecimals( field1, field3, new MathContext( 21 ) ) ); }
/** * 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" ); } }
public static Object divide( 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( metaA.getNumber( dataA ), metaB.getNumber( dataB ) ); case ValueMetaInterface.TYPE_INTEGER: return divideLongs( metaA.getInteger( dataA ), metaB.getInteger( dataB ) ); case ValueMetaInterface.TYPE_BIGNUMBER: return divideBigDecimals( metaA.getBigNumber( dataA ), metaB.getBigNumber( dataB ), null ); default: throw new KettleValueException( "The 'divide' function only works on numeric data." ); } }
/** * 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" ); } }