Math.round
Если дробная часть числа равна 0.5 или больше, то аргумент округляется к следующему большему целому. Если дробная часть меньше, чем 0.5, то округление производится до ближайшего меньшего целого.
// возвратит 20 x=Math.round(20.49) // возвратит 21 x=Math.round(20.5) // возвратит -20 x=Math.round(-20.5) // возвратит -21 x=Math.round(-20.51)
См. также
Очень жаль, что нет функции, которая округляет до нужного знака. В статье неплохо бы ее написать.
Округление до нужной точности после запятой
Для этого используется метод toFixed.
0.1234.toFixed(2) = 0.12
.toFixed() не всегда работает правильно.. в Firefox 21.0, Chrome, Safari и Opera результатом такой строки
parseFloat(71.175).toFixed(2) будет 71.17 .
а такое результатом выражения
Math.round(parseFloat(71.175) * 100) / 100 будет 71.18, т.е. результат правильно округленный
при этом IE на тех же выражениях выдает всегда 71.18 ! похоже «правильность» js еще и от браузера зависит
>не всегда работает правильно.
parseFloat(71.175).toFixed(2)=71.17
правильно, это называется «банковское округление», где при округлении 5 учитывается предшествующий знак, нечетные в меньшую, четные в большую сторону.
поэтому
parseFloat(71.185).toFixed(2) будет 71.19
это округление используется в .NET
Но это только для toFixed(2). Для toFixed(1) или toFixed(3) этот феномен не наблюдается
Не могу найти функцию, которая возвращает дробную часть числа
123.456 % 1
и взять цифр сколько там надо
можно еще так:
123.456.toString().split(/\./)[1];
Стоит еще раз поставить ударение: toFixed возвращает строковое представление числа, а поскольку и сравнение и сложение для строковых переменных в JS возможно (последнее становится конкатенацией) то желательно применять что то вроде
var foo = 1 * number.toFixed(2)
var foo = parseInt(number.toFixed(fc), 10);
Дельный совет, спасибо. Провернуть такое при помощи toFixed() почему-то не получилось.
Собственно функция round с нужной точностью, для страждущих:
Вот ещё один вариант, но за точность не ручаюсь:
> Собственно функция round с нужной точностью, для страждущих:
Math.round(10000.345 * 100) / 100 = 10000.34
Number.prototype.round = function(base) < if (base == null || base < 0) < return this; >var string = this.toString(); var point_index = string.indexOf("."); if (point_index == -1) < return this; >var symbol_index = point_index + 1 + base; if (symbol_index >= string.length) < return this; >var integer = parseInt(string.substring(0, point_index), 10); var fractional = parseInt(string.substring(point_index + 1, point_index + 1 + base), 10) || 0; var symbol = parseInt(string.charAt(symbol_index), 10); if (symbol >= 5) < if (base == 0) < integer ++; >else < fractional ++; >> return parseFloat(integer + "." + fractional); >
Все равно это не решает проблемы:
10000.345.round(1) = 10000.3
Отправить комментарий
- Полезные.
- Дополняющие прочитанное.
- Вопросы по прочитанному. Именно по прочитанному, чтобы ответ на него помог другим разобраться в предмете статьи. Другие вопросы могут быть удалены.
Для остальных вопросов и обсуждений есть форум.
Учебник javascript
Основные элементы языка
Сундучок с инструментами
Интерфейсы
Все об AJAX
Оптимизация
Разное
- Асинхронное программирование
- Google Gears в деталях
- Javascript Flash мост
- Букмарклеты и правила их написания
- О подборке книг на сайте
- Почему — плохо
- Способы идентификации в интернете
- Уровни DOM
- Что почитать?
- Шаблонизация с javascript
- Юнит-тесты уровня браузера на связке Selenium + PHP.
- Справочники: Javascript/HTML/CSS
- Система сборки и зависимостей Google Closure Library
- Хранение данных на клиенте. DOM Storage и его аналоги.
- 10 лучших функций на JavaScript
- You can certainly see your enthusiasm.
1 час 51 минута назад - Хорошая статья, которая меня кое-чему.
3 часа 26 минут назад - Tavor TS12 for Sale
4 часа 28 минут назад - buy420weeds.com, igetcartsforsale.com.
14 часов 16 минут назад - สล็อตเว็บตรง.
17 часов 9 минут назад - Join us for an สล็อตเครดิตฟรี.com .
17 часов 12 минут назад - The eBay credit card customer service.
18 часов 13 минут назад - Thank you for this great read. I am.
18 часов 20 минут назад - Thanks for letting me link to your.
18 часов 39 минут назад - I get a lot of great ideas from your.
18 часов 40 минут назад
PHP ROUND против Javascript ROUND
Я нашел очень странную проблему, проблема заключается в методе ROUND в PHP и Javascript, результаты вычислений не совпадают!?
echo round(175.5); // 176 echo round(-175.5); // -176
console.log(Math.round(175.5)); // 176 console.log(Math.round(-175.5)); // -175
кто-нибудь знает почему? и как сделать Javascript и PHP одинаковыми результатами?
Это не проблема, это хорошо документально
Если дробная часть равна 0,5, аргумент округляется до следующее целое число в направлении + ∞. Заметим, что это отличается от многоязычных (круглых) функций, которые часто в этом случае следующее целое от нуля, вместо этого (давая другой результат в случай отрицательных чисел с дробной частью ровно 0,5).
Если вы хотите иметь такое же поведение в Javascript, я бы использовал
var n = -175.5; var round = Math.round(Math.abs(n))*(-1)
Быстрое решение состоит в том, чтобы сделать следующее:
echo round(-175.5, 0, PHP_ROUND_HALF_DOWN); // -175
Существуют и другие способы выбора:
Дополнительную информацию см. в документации.
Эта функция будет вести себя так же, как в javascript:
function jsround($float, $precision = 0) < if($float < 0)< return round($float, $precision, PHP_ROUND_HALF_DOWN); >return round($float, $precision); >
console.log(Math.round(175.5)); // 176 console.log(Math.round(-175.5)); // -175
175.5 его круглое значение 176 это значение увеличивается.
-175.5 круглое значение – -175. Потому что, когда я округляю -175.5, тогда это также увеличивает значение -175 > -176.
Чтобы управлять им, используйте ceil и floor для округления. Таким образом, вы можете выбрать, какой способ округлить
Округление чисел в PHP
В PHP для округления чисел применяются следующие функции:
Округление к ближайшему целому
Функция round($num, $precision) возвращает округлённое значение $num с указанной точностью $precision (количество цифр после запятой).
echo round(111.455); // 111 // Один знак после запятой echo round(111.455, 1); // 111.5 // Два знака после запятой echo round(111.455, 2); // 111.46
Также функция round() может округлять целую часть числа, для этого нужно указать отрицательный $precision .
// Один знак перед запятой echo round(111.455, -1); // 110 // Два знака перед запятой echo round(111.455, -2); // 100
Третьим аргументом функции можно повлиять способ округления.
PHP_ROUND_HALF_UP | Округляет от нуля, когда следующий знак находится посередине. То есть округляет 1.5 в 2 и -1.5 в -2. |
PHP_ROUND_HALF_DOWN | Округляет к нулю, когда следующий знак находится посередине. То есть округляет 1.5 в 1 и -1.5 в -1. |
PHP_ROUND_HALF_EVEN | Округляет до ближайшего чётного значения, когда следующий знак находится посередине. То есть округляет 1.5 и 2.5 в 2. |
PHP_ROUND_HALF_ODD | Округляет до ближайшего нечётного значения, когда следующий знак находится посередине. То есть округляет 1.5 в 1 и 2.5 в 3. |
Округление к большему
Функция ceil($num) – всегда округляет число в большую сторону.
echo ceil(1.1); // 2 echo ceil(1.5); // 2 echo ceil(1.6); // 2