Как сделать положительное число отрицательным 1с
Число в 1С 8 — значение примитивного типа Число. Числовым типом может быть представлено любое десятичное число. С числовыми данными возможно совершать основные арифметические операции: сложение, вычитание, умножение и деление. Максимальное количество разрядов для числа в 1с 8: 38 знаков.
Литералы числа: набор цифр вида: [+|-]<0|1|2|3|4|5|6|7|8|9>[.<0|1|2|3|4|5|6|7|8|9>] В качестве разделителя целой и дробной части используется «.» (точка).
Пример 1. Создадим числовую переменную
Преобразование значений другого типа в число
Преобразовать в число можно значения строкового типа, либо логического типа (Булево). Значение типа Булево преобразуется в число по следующим правилам:
- Ложь преобразуется в 0;
- Истина преобразуется в 1.
Значение типа Строка преобразуется в число в том случае, если оно является строковым представлением литерала численного типа.
Пример 2. Преобразовать в 1с число строку «1.25»
После выполнения данного кода в переменной ПолученноеЧисло будет содержаться числовое значение 1.25
Пример 3. Преобразовать в число строку «Привет мир!»
Функции работы со значениями типа Число в 1с 8.3
В данном разделе будут рассмотрены основные функции работы с числами в 1с 8 и приведены примеры их использования.
Цел(). Возвращает целую часть числа переданного в параметре.
Пример 4. Определить делится ли число 121 на 11.
Окр(, , ). Функция округляет число, переданное в первом параметре, до знака после запятой переданного во втором параметре. Значение разрядности может быть и нулевым (округление до целого) и отрицательным (округление до соответствующего разряда целой части). Параметр РежимОкругления может принимать значения:
- 0 (или РежимОкругления.Окр15как10). Округляет в меньшую сторону, то есть при округлении 1.5 будет возвращено 1;
- 1 (или РежимОкругления.Окр15как20). Округляет в большую сторону, то есть при округлении 1.5 будет возвращено 2;
Пример 5. Для того чтобы лучше разобраться с принципами округления рассмотрим округление до целого в меньшую и большую стороны, на ряде чисел от 1.1 до 1.9
Pow(, ). Возводит число переданное в первом параметре в степень переданную во втором параметре.
Пример 6. Извлечь квадратный корень из числа 144, а затем возвести его в квадрат, в итоге снова должно получится число 144.
Как-то раз с коллегой зашел разговор о том почему в платформе не реализована функция получения модуля числа, ведь для учетной системы это довольно нужная вещь ( скорее всего разработчики платформы еще заняты написанием функции инкрементации и им не до этого , кстати если у вас есть предположения, то пишите в комментариях) и мы обсуждали, что способов написания такой функции может быть несколько и я решил посчитать, а сколько же их можно придумать. Конечно большинство из них "высосаны из пальца" и не могут использоваться на практике в виду здравого смысла, но нас это не останавливает), итак, поехали!
1.Наиболее логичный и распространенный способ, проверяем на превышение нуля и инвертируем значение при необходимости
2.Также довольно распространенный способ, используем функцию Макс()
На этом адекватные способы закончились) и начинаются извращения начинаем использовать
3.Перевести в строку, избавиться от минуса и конвертировать обратно в число?! Легко!
4.Далее вспоминаем, что можем использовать com-объекты, а это открывает нам удивительные возможности
Изначально я использовал такой код:
Но в серверном контексте я получил ошибку отсутствия класса из-за различия в разрядности, а делать обертку на корпоративном сервере не хотелось, поэтому я решил использовать другой com, а именно regexp
5.Используем список значений и сортируем, почему нет?
6.Используем запрос, в принципе это нормальный способ и т.к. вычисление производится на стороне СУБД я решил его тоже включить
7.Далее вспоминаем из курса школьной программы гуглим, что
Модуль числа a – это арифметический квадратный корень из квадрата числа a , исходя из этого пишем функцию
8.Используем Формат , чтобы избавиться от минуса и используем функцию Вычислить
Да остановись уже!
9.Здесь вообщем то уже читерство, используем ОписаниеТипов с допустимым знаком "+" и если после приведения результат = 0, то инвертируем значение
10.И напоследок используем такой же подход, перехватываем исключение в функции, где параметр положительное число, например, СлучайноеЧисло
И в заключение этой "шедевральной" статьи график (обработка во вложении) по скорости выполнения на 10000 итерациях. Версия платформы: 8.3.13.1513
Ожидаемо запрос и com самый медленный ввиду инициализации объектов, а математика самая быстрая.
Знаешь еще способы - пиши в комментах!
На этом дорогие друзья у меня все, и кстати это моя первая статья ( я долго копил свой опыт, чтобы поделиться им с сообществом ), надеюсь, ее шуточный характер не встанет мне боком)
мы все знаем, что самый высокий бит Int32 определяет его знак. 1 указывает, что он отрицательный и 0 что он положительный (возможно, наоборот). Могу ли я преобразовать отрицательное число в положительное, изменив его самый высокий бит?
Я пытался сделать это, используя следующий код:
но это не работает.
Если вы просто ищете побитовый способ сделать это (например, вопрос интервью и т. д.), Вам нужно отрицать число (побитовое) и добавить 1:
это перевернет знак, если он положительный или отрицательный. В качестве небольшого предостережения это не сработает, если x является int.MinValue, однако, так как отрицательный диапазон на один больше положительного диапазона.
конечно, в реальном коде я бы просто использовать Math.Abs() Как уже было сказано.
почему бы вам просто не использовать Math.Abs(yourInt) способ? Я не вижу необходимости использовать побитовые операции.
наиболее значимый бит определяет его знак, правда. Но это еще не все:
преобразовать положительное число в отрицательное, вы должны:
- отрицание числа (например, +1, которое является 0000 0001 в двоичном формате, превращается в 1111 1110 )
- добавить 1 ( 1111 1110 превращается в 1111 1111 , который является -1)
этот процесс известен как двое дополняют.
Инвертирование процесса одинаково просто:
- подстрока 1 (например, -1, 1111 1111 превращается в 1111 1110 )
- отрицание числа ( 1111 1110 превращается в 0000 0001 , что снова +1).
как вы можете видеть, эту операцию невозможно реализовать с помощью двоичный или-оператора. Вам нужно побитовое не и добавить/substract.
Я просто решил это сделать:
выполнение этого выведет только положительные ints. В противном случае:
Что случилось с Math.Abs(i) Если вы хотите перейти от-ve к +ve, или -1*i Если вы хотите идти в обе стороны?
Это невозможно с |= оператора. Его нельзя отменить биты. И поскольку бит знака установлен на отрицательных числах, вы не можете его отменить.
ваши поиски, к сожалению, тщетны. Побитовый оператор OR будет не иметь возможность произвольно перевернуть немного. Ты можешь!--1-- > set немного, но если этот бит уже установлен или не сможет его очистить.
вы абсолютно не можете, так как отрицательный эти два дополнения оригинала. Поэтому, даже если верно, что в отрицательном числе MSB равно 1, недостаточно поставить 1, чтобы получить отрицательный бит. необходимо инвертировать все биты и добавить один.
если вы говорите об использовании побитовых операций, он не работает. Я предполагаю, что вы думали, что перевернете самый высокий бит (флаг знака), чтобы получить отрицательный, но это не сработает, как вы ожидаете.
число 6 представлено как 00000000 00000000 00000000 00000110 в 32-разрядное целое число. Если вы перевернете самый высокий БИТ (БИТ подписи) на 1, вы получите 10000000 00000000 00000000 00000110 , что составляет -2147483642 в десятичном формате. Не совсем то, что вы ожидали, я думаю. Это потому, что отрицательные числа сохраняются в "отрицательной логике", что означает, что 11111111 11111111 11111111 11111111 - Это -1.
если вы переворачиваете каждый бит в положительном значении x вы получаете -(x+1) . Например:
вы все равно должны использовать сложение (или вычитание) для получения правильного результата.
вы можете преобразовать отрицательное число в положительное, как это:
есть ли эквивалентный метод, чтобы сделать положительное число отрицательным?
так же, как вы делаете что-либо еще отрицательным: поместите отрицательный знак перед ним.
Примечание для всех, кто ответил с
как способ сохранить отрицательные числа отрицательными и превратить положительные отрицательные.
этот подход имеет один недостаток. Это не работает для всех чисел. Диапазон Int32 тип от "-2 31 " to " 2 31 - 1.- Это значит, что есть еще одно "отрицательное" число. Следовательно, Math.Abs(int.MinValue) выдает OverflowException .
в правильный способ - использовать условные операторы:
этот подход работает для "всех" чисел.
самый простой способ:
или гарантированно будет отрицательным.
чтобы переключить знак целого числа, вы просто используете оператор знака:
чтобы сделать его отрицательным, независимо от того, является ли исходное значение отрицательным или нет, вы сначала используете метод Abs:
EDIT: это неправильно для положительных входов. Я ошибся, забыв, что остальные биты в-x (2s-значение дополнения) являются "противоположными" их значению в +x, а не одинаковыми. Поэтому простое изменение знака бит не будет работать для положительных чисел.
Я оставлю это здесь для целей.
или хитрый способ ( я думаю ).
int y = x / ~int.Максвеллову;
и поэтому любой int32 или'ed с этим поставит 1 в бит знака (что делает его отрицательным) и оставит все остальные биты одинаковыми.
изменить: на самом деле, начиная с 1000 0000 0000 0000 0000 0000 0000 0000 на самом деле это Minvalue, это также должно работать:
просто для удовольствия:
просто для удовольствия:
обновление: красота этого подхода заключается в том, что вы можете легко переделать его в генератор исключение:
несмотря на то, что я опаздываю на вечеринку, я собираюсь присоединиться к некоторым полезным трюкам из моих аппаратных дней. Все они предполагают представление комплимента 2 для подписанных чисел.
никто не сказал, что это должен быть любой особенности отрицательное число.
Я использую myInt = -myInt;
Так Просто и легко
Если вы хотите иметь только положительные
умножьте его на -1.
более простой способ a = - a сделает одолжение
преобразование числа из положительного в отрицательное или отрицательного в положительное:
просто то, что я хочу поделиться.
как уже упоминалось ранее, просто умножение на -1 не круто, как int.MinValue * -1 == int.MinValue
это действительно зависит от вашего приложения, но для моего (Инвертирование осей джойстика) я хочу убедиться, что все крайности по-прежнему достижимы и поддерживают как можно больше точности.
С этой целью я сопоставляю Max Min, и все между ними получает * -1
Используя этот метод, -32767 недостижимо при инвертировании.
private static int Invert(int value)
X=*-1 может не работать на всех компиляторах. поскольку он читает 'умножить' 'вычесть' 1, а не минус Чем лучше alt X=(0-X) , [ЧТО ОТЛИЧАЕТСЯ ОТ X-=X ]
используйте binary и удалите последний бит, который отвечает за отрицательный знак.
или используйте двоичный файл или добавьте знак в тип данных.
этот soln может показаться абсурдным и неполным, но я могу гарантировать, что это самый быстрый метод.
Если вы не экспериментируете с тем, что я опубликовал, этот пост может выглядеть дерьмово :D
например, для int:
Int-32-битный тип данных, поэтому последний бит (32-й) определяет знак.
и со значением который имеет 0 в 32 месте и остальные 1. Он преобразует отрицательное нет в +ve.
У меня есть метод Java, в котором я суммирую набор чисел. Однако я хочу, чтобы любые отрицательные числа рассматривались как положительные. Так что . (1)+(2)+(1)+(-1) должно равняться 5.
Я уверен, что есть очень простой способ сделать это - я просто не знаю как.
просто позвони математика.abs. Например:
где будет установлен x to 5 .
концепция, которую вы описываете, называется "абсолютное значение", а Java имеет функцию математика.abs чтобы сделать это за вас. Или вы можете избежать вызова функции и сделать это самостоятельно:
ты ищешь абсолютное значение, приятель. Math.abs(-5) возвращает 5.
использовать abs функция:
этот код можно безопасно вызывать и на положительных числах.
вы спрашиваете об абсолютных значениях?
математика.пресс.(..) это функция, которую вы, вероятно, хотите.
вы хотите обернуть каждое число в Math.abs() . например,
если вы хотите избежать написания Math. -часть, вы можете включить математику util статически. Просто напишите
вместе с вашим импортом, и вы можете сослаться на abs() -функция, просто писать
самый простой, если подробный способ сделать это-обернуть каждое число в математику.abs () позвоните, чтобы вы добавили:
с логическими изменениями, чтобы отразить, как структурирован ваш код. Многословно, возможно, но это делает то, что вы хотите.
когда вам нужно представить значение Без понятия потери или отсутствия (отрицательное значение), которое называется "абсолютным значением".
логика получения абсолютного значения очень проста: "If it's positive, maintain it. If it's negative, negate it" .
это означает, что ваша логика и код должен работать следующим образом:
есть 2 способа отрицания значения:
- , ну, отрицая это значение: value = (-value);
- умножая его на "100% отрицательный", или "-1": value = value * (-1);
Обе-две стороны одной медали. Просто обычно ты этого не помнишь.--4--> на самом деле value = 1 * (-value); .
Ну, что касается того, как вы это делаете на Java, это очень просто, потому что Java уже предоставляет функцию для этого, в Math class : value = Math.abs(value);
да, делать это без Math.abs() это просто строка кода с очень простым математика, но зачем делать код уродливым? Просто используйте предоставленные Java
Читайте также: