25 lines
852 B
TypeScript
25 lines
852 B
TypeScript
|
|
import { getDecimalPlaces } from '$shared/lib/utils';
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Round a value to the precision of the given step
|
||
|
|
*
|
||
|
|
* This fixes floating-point precision errors that occur with decimal steps.
|
||
|
|
* For example, with step=0.05, adding it repeatedly can produce values like
|
||
|
|
* 1.3499999999999999 instead of 1.35.
|
||
|
|
*
|
||
|
|
* We use toFixed() to round to the appropriate decimal places instead of
|
||
|
|
* Math.round(value / step) * step, which doesn't always work correctly
|
||
|
|
* due to floating-point arithmetic errors.
|
||
|
|
*
|
||
|
|
* @param value - The value to round
|
||
|
|
* @param step - The step to round to (defaults to 1)
|
||
|
|
* @returns The rounded value
|
||
|
|
*/
|
||
|
|
export function roundToStepPrecision(value: number, step: number = 1): number {
|
||
|
|
if (step <= 0) {
|
||
|
|
return value;
|
||
|
|
}
|
||
|
|
const decimals = getDecimalPlaces(step);
|
||
|
|
return parseFloat(value.toFixed(decimals));
|
||
|
|
}
|