JSFiddle - React, Tailwind, and code Playground

JavaScript

let milestones = [10, 30, 20];
let milestonesSum = milestones.reduce((a, b) => a + b, 0);

function getPercentFromValue(val) {
  return val / milestonesSum * 100.0;
}

function getValueFromPercent(per) {
  return per / 100.0 * milestonesSum;
}

function getMilestoneIndexFromPercent(per) {
  let v = getValueFromPercent(per);
  let i = 0;
  while (i < milestones.length && v > milestones[i]) {
    v -= milestones[i];
    i++;
  }
  return i;
}

console.log("percent to value :");
for (let i = 0; i <= 100; i++) {
  console.log(i, getValueFromPercent(i), getMilestoneIndexFromPercent(i));
}
console.log("value to percent :");
for (let i = 0; i <= milestonesSum; i++) {
  console.log(i, getPercentFromValue(i), getMilestoneIndexFromPercent(getPercentFromValue(i)));
}