Как правильно выполнять расчёты?

<pre><code>const applieList = [
  • 28 марта 2026 г. 7:00
Ответы на вопрос 2
Надо чуть больше контекста — что именно вы хотите посчитать? (Сумму цен в массиве, среднее, проценты, расчёт со скидкой/налогом и т. п.?) Ниже привожу несколько типичных сценариев на JavaScript и рекомендации, чтобы расчёты были корректными и предсказуемыми.

1) Простая сумма чисел
```js
const apples = [1.2, 2.5, 3.0];
const sum = apples.reduce((acc, v) => acc + v, 0);
console.log(sum); // 6.7
```

2) Сумма объектов (цена × количество)
```js
const appleList = [
  { name: 'Red', price: 1.2, qty: 3 },
  { name: 'Green', price: 2.5, qty: 1 },
];

const total = appleList.reduce((acc, item) => acc + item.price * item.qty, 0);
console.log(total); // 6.1
```

3) Избегаем проблем с плавающей точкой (валюта)
Дробные числа в JS могут давать неожиданные результаты (0.1 + 0.2 !== 0.3). Для денег удобнее считать в целых (крупные единицы — копейки/цента) либо использовать библиотеку decimal/bignumber.

Вариант с копейками:
```js
const items = [
  { price: 1.2, qty: 3 }, // цена в долл.
  { price: 2.5, qty: 1 },
];

// переводим в копейки (центов)
const totalCents = items.reduce((acc, it) => acc + Math.round(it.price * 100) * it.qty, 0);
const total = totalCents / 100;
console.log(total); // 6.10
```

Или библиотека (decimal.js / big.js) для финансовых операций:
```js
// пример с decimal.js (нужно установить пакет)
import Decimal from 'decimal.js';
const total = items.reduce((acc, it) =>
  acc.plus(new Decimal(it.price).times(it.qty)), new Decimal(0));
console.log(total.toString());
```

4) Округление и форматирование вывода
- Для аккуратного округления до двух знаков: Math.round(value * 100) / 100 или Decimal.
- Для отображения валюты: Intl.NumberFormat

```js
const value = 6.1;
const rounded = Math.round(value * 100) / 100;
console.log(rounded.toFixed(2)); // "6.10"

const nf = new Intl.NumberFormat('ru-RU', { style: 'currency', currency: 'RUB' });
console.log(nf.format(value)); // "6,10 ₽"
```

5) Проверка входных данных
- Преобразуйте строки в числа: parseFloat, Number.
- Проверяйте NaN: Number.isFinite(value) / Number.isNaN.
- Обрабатывайте пропущенные поля qty/price.

6) Пример полного расчёта (subtotal, скидка, налог, итог)
```js
const cart = [
  { price: 1.2, qty: 3 },
  { price: 2.5, qty: 1 },
];

const subtotalCents = cart.reduce((acc, it) => acc + Math.round(it.price * 100) * it.qty, 0);
const discountPercent = 10; // %
const discountCents = Math.round(subtotalCents * discountPercent / 100);
const taxPercent = 20;
const taxedCents = Math.round((subtotalCents - discountCents) * taxPercent / 100);
const totalCents = subtotalCents - discountCents + taxedCents;

console.log('subtotal:', (subtotalCents / 100).toFixed(2));
console.log('discount:', (discountCents / 100).toFixed(2));
console.log('tax:', (taxedCents / 100).toFixed(2));
console.log('total:', (totalCents / 100).toFixed(2));
```

Если покажете ваш массив applieList (структуру объектов и какое именно значение хотите посчитать), я напишу точный и безопасный пример расчёта под ваш кейс.
у тебя два бага: параметр называется rule_id а в теле используешь ruleIdorId, и ищешь в draftList вместо applieList. По expected тебе нужно найти элемент в applieList по id === rule_id и вернуть id предыдущего. <br/> <br/> <pre><code>function getPositionAfterRuleId(rule_id, applieList) {
    let idx = applieList.findIndex(item =&gt; String(item.id) === String(rule_id));
    return idx &gt; 0 ? applieList[idx - 1].id : "";
}</code></pre>
Похожие вопросы