Работа с маленькими десятичными точками в Javascript

1

В настоящее время я работаю с десятичными точками, но Javascript, кажется, округляет все время.

Например, здесь один из моих расчетов:

(1 + 0,05) ^ (1/12)

Это должно вернуть 1.0040741237836483016054196026721, но все, что я получаю, - это 1.

Я пробовал использовать библиотеку Big.js, но он все еще возвращает мне 1, и мне нужны эти десятичные точки для получения точного результата, есть ли способ указать количество десятичных позиций, которые я хочу?

  • 0
    Можете ли вы опубликовать JavaScript, который вы используете для расчета?
  • 0
    Проверьте decimal.js . Это может быть больше из того, что вы ищете.
Теги:

3 ответа

4
Лучший ответ

Символ ^ имеет побитовую семантику XOR в javascript. См. Здесь.

Следующий фрагмент кода показывает, как получить правильный результат:

console.log('(1 + 0.05) ^ (1/12) = ${Math.pow((1 + 0.05), (1/12))}');
  • 0
    Я почувствовал себя таким идиотом, поняв это.
1

Как отмечено в другом ответе, вы можете использовать vanilla JS, но если вам нужно выполнять математические операции с точностью, чем вы можете искать в таких библиотеках, как decimal.js, чтобы поддерживать эту точность.

const vanJS = Math.pow(1 + 0.05, 1/12);
const decJS = Decimal.pow(1 + 0.05, 1/12).toPrecision(20);

console.log({ vanJS, decJS });
<script src="/decimal.min.js"></script>
1

Вы должны всегда использовать библиотеку Math (MDN), чтобы выполнять вычисления. Вы можете использовать функцию Pow(val, exponential) в ваших интересах.

Если у вас есть 1/2, вы можете сказать это 2 ^ (-1). Таким образом, вы всегда можете перевести деление на экспоненциальное

У Javascript есть некоторые проблемы с точностью, и вам будет трудно работать с плавающими точками.

var amount  = (1 + 0.05) ^ (1/12);
var amountPow = Math.pow(1 + 0.05, Math.pow(12,-1));
console.log((1 + 0.05) ^ (1/12)); // Normal
console.log(amountPow); // Exponential function Math
  • 0
    Math.pow самом деле работает и с реальными показателями. Итак, ваш второй вызов Math.pow не является неправильным, но ненужным, поскольку Math.pow(1 + 0.05, 1/12) === Math.pow(1 + 0.05, Math.pow(12, -1)) .
  • 0
    Это моя точка зрения: adripofjavascript.com/blog/drips/… - «Деление целых чисел и умножение на десятичные числа может все еще приводить к неточным значениям, но сложение, вычитание и умножение базовых целых чисел будет точным»
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню