Math@1
Node Math@1 performs mathematical operations on numeric data within JSON objects. It can add, subtract, multiply, divide, calculate modulo values, or round numbers to a specified number of decimal places using either a constant value or a value from another location in the data.
Adapter Prerequisites
- General availability: All adapters support this node type.
Node Configuration
For fields path, targetPath, targetValueWriteMode, and targetValueKind, see Overview.
transformations:
- type: Math@1
path: $.sensors # Path to the objects containing numeric data
itemPath: $.temperature # Path within each object to the numeric value
itemTargetPath: $.temperatureFahrenheit # Path where the result will be stored
operation: Multiply # Mathematical operation to perform
value: 1.8 # Constant value to use in operation
# OR use valuePath instead of value:
# valuePath: $.conversionFactor # Path to value to use in operation
Parameters
Required Parameters
| Parameter | Type | Description |
|---|---|---|
path | string | JSON path to the objects containing the numeric data to process |
itemPath | string | Relative path within each object to the numeric value to process |
itemTargetPath | string | Relative path within each object where the result will be stored |
operation | enum | Mathematical operation to perform: Add, Subtract, Multiply, Divide, Modulo, or Round |
Optional Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
value | double | - | Constant numeric value to use in the mathematical operation |
valuePath | string | - | JSON path to the value to use in the mathematical operation |
decimalPlaces | int | 0 | Number of decimal places to round to (only used with Round operation) |
Mathematical Operations
The node supports six basic mathematical operations:
Add: Adds the specified value to the source valueSubtract: Subtracts the specified value from the source valueMultiply: Multiplies the source value by the specified valueDivide: Divides the source value by the specified valueModulo: Returns the remainder after dividing the source value by the specified valueRound: Rounds the source value to the specified number of decimal places (usesdecimalPlacesparameter)
Value Sources
For arithmetic operations (Add, Subtract, Multiply, Divide, Modulo), you can specify the second operand in two ways:
- Constant Value: Use the
valueparameter to specify a fixed numeric value - Dynamic Value: Use the
valuePathparameter to reference a value from elsewhere in the data
Only one of value or valuePath should be specified. If valuePath is provided, it takes precedence over value.
Note: The Round operation does not use value or valuePath parameters. It only requires the decimalPlaces parameter to determine the precision of rounding.
Error Handling
The node will:
- Issue a warning if no source data is found at the specified
path - Issue a warning if no numeric value is found at the specified
itemPathfor an object - Throw an error if the value (from
valueorvaluePath) is null or not set - Throw an error if an unsupported operation is specified
Examples
Example 1: Temperature Conversion (Constant Value)
Convert temperature from Celsius to Fahrenheit:
transformations:
- type: Math@1
path: $.readings
itemPath: $.celsius
itemTargetPath: $.fahrenheit
operation: Multiply
value: 1.8
- type: Math@1
path: $.readings
itemPath: $.fahrenheit
itemTargetPath: $.fahrenheit
operation: Add
value: 32
Input:
{
"readings": [
{ "celsius": 20, "sensor": "A1" },
{ "celsius": 25, "sensor": "A2" }
]
}
Output after both transformations:
{
"readings": [
{ "celsius": 20, "sensor": "A1", "fahrenheit": 68 },
{ "celsius": 25, "sensor": "A2", "fahrenheit": 77 }
]
}
Example 2: Price Calculation with Tax (Dynamic Value)
Calculate total price including tax using a dynamic tax rate:
transformations:
- type: Math@1
path: $.orders
itemPath: $.subtotal
itemTargetPath: $.tax
operation: Multiply
valuePath: $.taxRate
- type: Math@1
path: $.orders
itemPath: $.subtotal
itemTargetPath: $.total
operation: Add
valuePath: $.tax
Input:
{
"taxRate": 0.15,
"orders": [
{ "id": "ORD-001", "subtotal": 100 },
{ "id": "ORD-002", "subtotal": 250 }
]
}
Output after both transformations:
{
"taxRate": 0.15,
"orders": [
{ "id": "ORD-001", "subtotal": 100, "tax": 15, "total": 115 },
{ "id": "ORD-002", "subtotal": 250, "tax": 37.5, "total": 287.5 }
]
}
Example 3: Discount Application
Apply a percentage discount to product prices:
transformations:
- type: Math@1
path: $.products
itemPath: $.originalPrice
itemTargetPath: $.discount
operation: Multiply
value: 0.2 # 20% discount
- type: Math@1
path: $.products
itemPath: $.originalPrice
itemTargetPath: $.salePrice
operation: Subtract
valuePath: $.discount
Input:
{
"products": [
{ "name": "Widget A", "originalPrice": 50 },
{ "name": "Widget B", "originalPrice": 75 }
]
}
Output:
{
"products": [
{ "name": "Widget A", "originalPrice": 50, "discount": 10, "salePrice": 40 },
{ "name": "Widget B", "originalPrice": 75, "discount": 15, "salePrice": 60 }
]
}
Example 4: Unit Conversion
Convert measurements from meters to feet:
transformations:
- type: Math@1
path: $.measurements
itemPath: $.meters
itemTargetPath: $.feet
operation: Multiply
value: 3.28084
Input:
{
"measurements": [
{ "location": "Room A", "meters": 10 },
{ "location": "Room B", "meters": 15.5 }
]
}
Output:
{
"measurements": [
{ "location": "Room A", "meters": 10, "feet": 32.8084 },
{ "location": "Room B", "meters": 15.5, "feet": 50.85302 }
]
}
Example 5: Modulo Operation for Remainders
Calculate remainder for pagination or cyclic patterns:
transformations:
- type: Math@1
path: $.records
itemPath: $.index
itemTargetPath: $.pageGroup
operation: Modulo
value: 10
Input:
{
"records": [
{ "id": "item-1", "index": 23 },
{ "id": "item-2", "index": 47 },
{ "id": "item-3", "index": 100 },
{ "id": "item-4", "index": 8 }
]
}
Output:
{
"records": [
{ "id": "item-1", "index": 23, "pageGroup": 3 },
{ "id": "item-2", "index": 47, "pageGroup": 7 },
{ "id": "item-3", "index": 100, "pageGroup": 0 },
{ "id": "item-4", "index": 8, "pageGroup": 8 }
]
}
Example 6: Round Operation for Decimal Precision
Round values to a specific number of decimal places:
transformations:
- type: Math@1
path: $.measurements
itemPath: $.value
itemTargetPath: $.rounded
operation: Round
decimalPlaces: 2
Input:
{
"measurements": [
{ "id": "temp1", "value": 23.456789 },
{ "id": "temp2", "value": 19.1 },
{ "id": "temp3", "value": 25.999 },
{ "id": "temp4", "value": 20.0 }
]
}
Output:
{
"measurements": [
{ "id": "temp1", "value": 23.456789, "rounded": 23.46 },
{ "id": "temp2", "value": 19.1, "rounded": 19.1 },
{ "id": "temp3", "value": 25.999, "rounded": 26.0 },
{ "id": "temp4", "value": 20.0, "rounded": 20.0 }
]
}
Example 7: Round to Integer (Default)
Round to nearest integer using default decimalPlaces (0):
transformations:
- type: Math@1
path: $.scores
itemPath: $.percentage
itemTargetPath: $.roundedScore
operation: Round
Input:
{
"scores": [
{ "student": "Alice", "percentage": 87.6 },
{ "student": "Bob", "percentage": 92.4 },
{ "student": "Charlie", "percentage": 89.5 }
]
}
Output:
{
"scores": [
{ "student": "Alice", "percentage": 87.6, "roundedScore": 88 },
{ "student": "Bob", "percentage": 92.4, "roundedScore": 92 },
{ "student": "Charlie", "percentage": 89.5, "roundedScore": 90 }
]
}
Use Cases
- Unit Conversion: Convert between different measurement units
- Price Calculation: Apply taxes, discounts, or markups to prices
- Data Normalization: Scale or adjust numeric values for analysis
- Formula Application: Apply mathematical formulas to transform data
- Percentage Calculations: Calculate percentages, ratios, or proportions
- Financial Calculations: Compute interest, fees, or other financial metrics
- Remainder Calculations: Use modulo for pagination, cyclic patterns, or hash buckets
- Data Partitioning: Distribute data across buckets using modulo operations
- Scheduling: Calculate recurring intervals or cycle positions
- Precision Control: Round values to specific decimal places for display or storage
- Data Cleaning: Standardize numeric precision across datasets
Notes
- Numeric Values Only: The node only operates on numeric values. Non-numeric values will cause warnings and be skipped
- Precision: Results maintain the precision of the input values and operations
- Array Processing: The node processes all objects found at the specified
path - Path Validation: Both
itemPathand target paths are relative to each object found atpath - Division by Zero: Division by zero will result in infinity or NaN values depending on the input
- Modulo by Zero: Modulo by zero will throw a DivideByZeroException
- Value Requirements: Either
valueorvaluePathmust be specified for arithmetic operations, but not both - Round Operation: The
Roundoperation uses banker's rounding (MidpointRounding.ToEven) and only requiresdecimalPlaces - Decimal Places: Default is 0 (round to integer), negative values are not supported
Related Nodes
- FormatString@1: Format numeric results into strings with custom formatting
- ConvertDataType@1: Convert between different data types including numeric conversions