У меня есть выражение, которое используется для оценки процентилей путем интерполяции между двумя значениями.Есть ли способ улучшить точность с плавающей запятой этого выражения?
windowMin + (currentPercentile - lastPercentile) * (windowMax - windowMin)/(percentile - lastPercentile)
Это дает мне очень хорошие результаты в реальном мире. Тем не менее, в моих модульных тестах у меня возникают проблемы с тем, что все работает правильно, так как я последовательно получаю значительную ошибку округления.
В трех случаях теста, я стараюсь, чтобы получить 40 тыс, 50 я и 60 я процентиля, в результате этих вычислений:
1 + (0.4 - 0.3333333333333333) * (2 - 1)/(0.6666666666666666 - 0.3333333333333333)
1 + (0.5 - 0.3333333333333333) * (2 - 1)/(0.6666666666666666 - 0.3333333333333333)
1 + (0.6 - 0.3333333333333333) * (2 - 1)/(0.6666666666666666 - 0.3333333333333333)
Это дает:
{
"0.4": 1.2000000000000002,
"0.5": 1.5,
"0.6": 1.8
}
Это не соответствует моему утверждению, которое ищет 1.2
для 40 th percentil е.
Есть ли способ реструктурировать это выражение для повышения точности во всех случаях? Если нет, есть ли простой способ обойти эту проблему с утверждениями chai?
Возможный дубликат [Является ошибкой JavaScript с плавающей запятой?] (Http://stackoverflow.com/questions/588004/is-javascripts-floating-point-math-broken) – Barmar
См. Также http: // stackoverflow. com/questions/2221167/javascript-format-a-rounded-number-to-n-decimals? lq = 1 – Barmar
@Barmar: Это не дубликат. Я спрашиваю о конкретном выражении. Я не прошу объяснений, я прошу смягчить ситуацию. –