Мне нужно усечь количество десятичных знаков в числе с плавающей запятой до определенного числа и отбросить остальные, на данный момент единственный метод, который я нашел, toFixed
но это округляет значение, а не усекает:
let num = 21.777777;
console.log(num.toFixed(1));
console.log(num.toFixed(2));
console.log(num.toFixed(3));
console.log(num.toFixed(4));
Это случилось с кем-то еще, как вы это решили, я думал преобразовать в строку и обрезать строку, но я хочу знать, есть ли способ сделать это, не прибегая к этому.
ВЕРСИЯ
Как уже упоминалось, в коде исходного ответа есть ошибка при выполнении операций с плавающей запятой, а именно потеря десятичных знаков. Мы можем решить эту проблему, посмотрев, меньше или равно ли число знаков после запятой количеству знаков, которые необходимо усечь.
Или, следуя этой идее, упростите ее следующим образом:
Я также сделал несколько тестов, которые вы можете увидеть здесь .
Это с английского сайта, но вы можете взглянуть на ответы на этот вопрос. Это очень интересно.
ОРИГИНАЛЬНЫЙ ОТВЕТ
Немного математики:
Для этого нет предопределенной функции, и это не тривиально, потому что выполнение математических операций с числами с плавающей запятой всегда открыто для возможных ошибок округления, поэтому лучше перестраховаться: преобразовать число в строку, а затем остаться с желаемыми десятичными знаками:
Объяснение: Регулярное выражение использует числа, пока не найдет точку. Затем он сохраняет следующие два найденных числа (или меньше, если их нет).
Обратите внимание, что функция возвращает текст, а не число. Его можно преобразовать обратно в число с помощью функции
Number(texto)
Эта функция короткая, четкая, лаконичная и охватывает (надеюсь) все (3 разные) ситуации. Для конкретных случаев это можно упростить, просто исключив то, что не будет использоваться.
Расчет производится во всех трех случаях с небольшими изменениями одного и того же утверждения. Случаи:
В поисках максимальной простоты и элегантности я предпочитаю эту новую версию:
х = число (х); десятичные цифры = число (десятичные цифры);
а. х = х * (10 ** десятичных цифр); // перемещаем десятичную точку вправо на столько знаков, сколько указано decimalDigits;
б. х = х - (х % 1); Мы вычисляем десятичную часть нового числа (x % 1) и вычитаем ее.
в. х = х/(10 ** десятичных цифр); Переносим запятую в исходное положение.
(Это предыдущая версия, которую я оставляю на случай, если кому-то она больше понравится:
Здесь parseInt был тем, кто отвечал за удаление десятичной части)
возвратx;
вернуть x.toString();
д. toString() дает нам текстовое представление того же числа.
Возвращает текстовую строку, ВКЛЮЧАЯ незначащие нули. То же, что и 2., но изменение последнего шага .toString() на: .toFixed(decimalDigits)
вернуть x.toFixed (десятичные цифры)
д. toFixed(decimaDigits) возвращает текстовую строку, включающую при необходимости незначащие нули, чтобы она содержала ровно то количество десятичных символов, которое указано в decimaDigits.
toFixed(decimalDigits), если бы были какие-то оставшиеся десятичные знаки, это также устранило бы их — округление вместо усечения — но в этом случае из предыдущих шагов мы знаем, что ничего не осталось: мы уже усекли их на шаге b. (см. подготов. п. *0.), в большинстве отсутствуют незначащие нули.
Вы также можете использовать функцию toPesition().Эта функция определяет количество чисел, которые вы хотите отобразить, включая десятичные дроби, в дополнение к этому, она также приближает числа к более близкому количеству. Пример:
У меня есть пример, который может вам помочь, он показывает результат без округления, он просто показывает результат и первые два десятичных знака:
Я нашел способ с помощью javascript.
формат ввода выглядит следующим образом: 00000,00
Я задокументировал это на случай, если кому-то понадобится сделать адаптацию, им будет легче найти, где это сделать.