Да что тут непонятного, " - " применяется только к числам, по этому строка "5" приводится к числу и из 5 вычитается 2.
" + " применяется как к числам для сложения, так и к строкам для конкатенации, первый операнд строка"5", значит применяем конкатенацию, приводя 3 к строке и получаем "53".
А последний пример комбинация из двух первых по сути, только к двум применяется унарный оператор " - ", "2" приводится к числу 2, добавляется отрицание -2, приводится опять к строке "-2", а потом конкатенируется с "5"!
Да я-то понимаю, но если код на тысячи строк, то каждый раз вчитываться в подобное и прикидывать в голове - теряешь кучу времени.
А если у тебя там еще не константы, а пара переменных, которые пришли из разных мест через несколько слоев вызовов функций, то это, вообще, поле чудес с попыткой угадать "5" там было или 5.
"Стандарт обработки"?! Не знаю с какой планеты ты достал компьютер, но у нас тут это все упирается в, мать его, физический принцип хранения и передачи данных. Который в свою очередь растет из фундаментальной науки, дискретной математики, на основе которой и были созданы компьютеры.
IEEE 754 - стандарт работы с двоичными числами с плавающей точкой. Почти вся вычислительная техника сегодня следует этому стандарту. Это не единственный стандарт цифровой арифметики и далеко не единственный возможный. Никакая фундаментальная наука не запрещает нам использовать троичные/четверичные вычислительные машины (не решит проблему точности) и другие способы представления дробного числа в памяти машины. Просто есть стандарт, и ему следуют для совместимости и переносимости программ.
Никто, конечно же, не мешает.
Но в реальном мире процессоры поддерживают работу с дробными числами только в этом формате. Потому если ты хочешь другой, то будь готов реализовывать его руками(ну или брать либу), и будь готов к критической просадке производительности, если тебе нужно много арифметики. Потому что тебе всю блядскую арифметику придется делать самому.
И, на самом деле, абсолютно везде, где идёт работа с деньгами, то есть, дробные числа это суммы денег, всё делается именно таким образом. Потому что точность там намного важнее скорости.
А, скажем, просчёт сцены для игры - на неточных, но быстрых флоатах.
Не всегда.
У тебя может быть несколько процессов с разной точностью. По обстоятельствам, не зависящим от тебя. Грубо говоря, где-то используется точность до цента, а где-то до сотой доли цента. Несмотря на то, что физически десятых и сотых долей цента не существует, в расчётах они могут участвовать. И внешние сервисы могут использовать различную точность, и тебе нужно с ними коммуницировать.
Есть также сервисы, которые в протоколе указывают, сколько знаков после запятой используется, и это число изменяемое в зависимости от специфики.
Так что - нет, нихуя оно не фиксед в общем случае.
Не надо путать визуализацию с внутренним представлением. Показываться они могут до цента или до сотой доли цента, а финансовые вычисления - до пятого знака после запятой. И fixed point это формат хранения и правила операций. По сути, значение в fixed point это три целых числа: до запятой, после запятой и фиксированный порядок. И по сути это целочисленная арифметика.
Я ниже написал.
Точка может плавать. Никто не гарантирует одинаковый порядок, это невозможно для общего случая. Разве что для одной валюты, и одного типа операций.
Ну и ты прав, по сути, всё равно это переводится в целые, считается в них, но всё равно надо везде и всегда помнить, где эта сраная точка, для каждой операции, когда стыкуются два разных процесса с разной точностью(вычисление процента и фактическое движение по счёту, например), и стыковка с внешними сервисами.
Нет, это опасно. Особенно если ты работаешь не с одной валютой и сложными выебонами.
Надо тебе посчитать 1.257% от суммы, и ты уже теряешь точность со своими 5 знаками.
Не бывает быстрых вычислений без потери точности, вопрос лишь в правилах округления. Но я вообще имел в виду рубли. Вычисления с fixed point до пятого знака дают удовлетворительную точность.
Ну так если цель "удовлетворительная" точность, то вообще флоаты. Они дают ошибку в последнем знаке, и только на единицу в одном вычислении. В варианте "только 5 знаков", ошибка может быть в 6 знаке, что на несколько порядков больше, чем в последнем во флоате.
Но, да. Я работал со всеми валютами, кроме рубля - он сейчас забанен везде.
Я, с некоторым опытом в финансах, если честно, вообще с трудом представляю себе понятие "удовлетворительная точность". Наши регуляторы за такую хуйню выебут и высушат. Нельзя просто так взять, и отбросить сумму денег при расчете в большинстве случаев. Даже если эта сумма для одной транзакции типа маленькая.
На сотнях миллионов транзакций получается нихуя не маленькая.
И, насчёт быстрых вычислений.
Пока ты в рамках одного фин процесса, с одной валютой и требованиями, у тебя обычные лонги(в инты может не влезть), и просто рядом тусуются настройки количества знаков, валюты, и отэтовсе. Сами расчеты быстрые, бо целочисленные - пока мы в одной "системе координат".
Но на стыке (внутри, или для внешнего сервиса), где могут быть разные настройки той же точки, приходится это учитывать и конвертировать. По разным правилам - где-то и округление идёт, но чаще нет, там уже от конкретики зависит.
Попробую на пальцах простой пример, без конкретики.
Смотри.
Если у нас перевод денег со счёта на счёт, то точность - до минимальной расчётной единицы валюты. Обычно это 2 знака от целого значения в валюте(2.55 доллара), и 0 знаков от количества в минимальных единицах(255 центов). Впрочем, подлянка и тут в том, что у валют это разное количество. Например, у венгерского форинта нет "копеек", минимальная единица это сам форинт.
Но если ты считаешь комиссию, или другой процент, то у тебя точность - это (порядок разницы минимальной единицы к основной) + 2 +(максимальное количество знаков после запятой в сумме процентной ставки).
То есть, для доллара, и только целых процентов, это 2+2+0. Для форинта, когда процент возможен типа 1.5 - это 0+2+1.
Кстати вспомнилось, android calculator встроенный где-то в ~android 4. Не заморачивались ребята и просто считали в double. На больших числах (даже целых, не дробных), которые я просто складывал, оно умудрялось считать неправильно.
В жабаскрипте нету двух int переменных. Есть просто 2 переменных, а инт они, или нет - ты не знаешь. Плюс, в джаваскрипте сложить можно что угодно с чем угодно, но результат может быть неожиданный.
Я не знаю.
Это добавляет геморроя проверки типа каждый раз, если надо писать нормально, а не "хуяк, хуяк, и так сойдёт", добавляет геморроя при чтении кода(блять, какой же тип сука ожидается у этой ахуительной функции???), добавляет геморроя в виде stupid undefined behavior в рантайме, когда пришло что-то не то, обработалось странным образом без ошибок в какую-то дичь, и успешно улетело дальше.
Но этим мало того, что пользуются, некоторые это любят, и даже тащат на сервер. Повбывав бы.
Меня ещё "веселит" что есть возможность явно определить тип переменной
Типа:
var result:Int = 1;
И в рантайме это может быть проигнорировано
Типа:
var num1:Int = 1;
var num2:Int = 1;
var result:Int = num1 + num2; // получится 11
Но пока что в топе по пиздецу кодинг на HAXE который потом конвертится в JS
Я пока над этим проджэктом работал - бухал жестко
Слот-машины(гэмблинг)
Там довольно большой проэкт был. Одних только погромистов 50+ шт
Там вообще весело было:
Изначально проэкт на чистом шарпе написан.
Потом шарповый код конвертится в Haxe
Потом хаксовый код конвертится в JS
Нахуя?
Насколько я понял, лид, который этот проект курировал пиздец как не любит юнити(изначально на неё планировали переписать)
И решил вот такое безобразие устроить
Уже 3й год как есть BigInt, который в определенном смысле даже лучше, чем встроенные целочисленные типы в строготипизированных языках, ибо он произвольной длины.
по большей части это примеры из разряда искусственных, которые в реале не делаются. хотя не так давно делал функцию клонирования записи, где надо собрать объект из пар [fieldname, value] разных типов. хотел пропустить через filter(n=>n) скипнуть null и [ ], заодно проебал все нули, а они были нужны. и долго не мог догнать в чем дело.
Sumit Wath
@Dashingsuma
V
Если бы избавиться от коронавируса можно было, пожертвовав одним из языков программирования, какой бы вы выбрали и почему JavaScript?
12:56 РМ • 19 Арг 20 • Twitter for Android
ill View Tweet activity
" + " применяется как к числам для сложения, так и к строкам для конкатенации, первый операнд строка"5", значит применяем конкатенацию, приводя 3 к строке и получаем "53".
А последний пример комбинация из двух первых по сути, только к двум применяется унарный оператор " - ", "2" приводится к числу 2, добавляется отрицание -2, приводится опять к строке "-2", а потом конкатенируется с "5"!
А если у тебя там еще не константы, а пара переменных, которые пришли из разных мест через несколько слоев вызовов функций, то это, вообще, поле чудес с попыткой угадать "5" там было или 5.
https://www.destroyallsoftware.com/talks/wat
let pidor = +traps + +memes;
Но в реальном мире процессоры поддерживают работу с дробными числами только в этом формате. Потому если ты хочешь другой, то будь готов реализовывать его руками(ну или брать либу), и будь готов к критической просадке производительности, если тебе нужно много арифметики. Потому что тебе всю блядскую арифметику придется делать самому.
И, на самом деле, абсолютно везде, где идёт работа с деньгами, то есть, дробные числа это суммы денег, всё делается именно таким образом. Потому что точность там намного важнее скорости.
А, скажем, просчёт сцены для игры - на неточных, но быстрых флоатах.
У тебя может быть несколько процессов с разной точностью. По обстоятельствам, не зависящим от тебя. Грубо говоря, где-то используется точность до цента, а где-то до сотой доли цента. Несмотря на то, что физически десятых и сотых долей цента не существует, в расчётах они могут участвовать. И внешние сервисы могут использовать различную точность, и тебе нужно с ними коммуницировать.
Есть также сервисы, которые в протоколе указывают, сколько знаков после запятой используется, и это число изменяемое в зависимости от специфики.
Так что - нет, нихуя оно не фиксед в общем случае.
Точка может плавать. Никто не гарантирует одинаковый порядок, это невозможно для общего случая. Разве что для одной валюты, и одного типа операций.
Надо тебе посчитать 1.257% от суммы, и ты уже теряешь точность со своими 5 знаками.
Но, да. Я работал со всеми валютами, кроме рубля - он сейчас забанен везде.
Только вот для плавающей точки последний знак это могут быть сотни. Не сотые доли, а сотни.
На сотнях миллионов транзакций получается нихуя не маленькая.
Пока ты в рамках одного фин процесса, с одной валютой и требованиями, у тебя обычные лонги(в инты может не влезть), и просто рядом тусуются настройки количества знаков, валюты, и отэтовсе. Сами расчеты быстрые, бо целочисленные - пока мы в одной "системе координат".
Но на стыке (внутри, или для внешнего сервиса), где могут быть разные настройки той же точки, приходится это учитывать и конвертировать. По разным правилам - где-то и округление идёт, но чаще нет, там уже от конкретики зависит.
Смотри.
Если у нас перевод денег со счёта на счёт, то точность - до минимальной расчётной единицы валюты. Обычно это 2 знака от целого значения в валюте(2.55 доллара), и 0 знаков от количества в минимальных единицах(255 центов). Впрочем, подлянка и тут в том, что у валют это разное количество. Например, у венгерского форинта нет "копеек", минимальная единица это сам форинт.
Но если ты считаешь комиссию, или другой процент, то у тебя точность - это (порядок разницы минимальной единицы к основной) + 2 +(максимальное количество знаков после запятой в сумме процентной ставки).
То есть, для доллара, и только целых процентов, это 2+2+0. Для форинта, когда процент возможен типа 1.5 - это 0+2+1.
What the f*ck JavaScript?
Это добавляет геморроя проверки типа каждый раз, если надо писать нормально, а не "хуяк, хуяк, и так сойдёт", добавляет геморроя при чтении кода(блять, какой же тип сука ожидается у этой ахуительной функции???), добавляет геморроя в виде stupid undefined behavior в рантайме, когда пришло что-то не то, обработалось странным образом без ошибок в какую-то дичь, и успешно улетело дальше.
Но этим мало того, что пользуются, некоторые это любят, и даже тащат на сервер. Повбывав бы.
Типа:
var result:Int = 1;
И в рантайме это может быть проигнорировано
Типа:
var num1:Int = 1;
var num2:Int = 1;
var result:Int = num1 + num2; // получится 11
Но пока что в топе по пиздецу кодинг на HAXE который потом конвертится в JS
Я пока над этим проджэктом работал - бухал жестко
Я разные вариации встречал
Там довольно большой проэкт был. Одних только погромистов 50+ шт
Там вообще весело было:
Изначально проэкт на чистом шарпе написан.
Потом шарповый код конвертится в Haxe
Потом хаксовый код конвертится в JS
Нахуя?
Насколько я понял, лид, который этот проект курировал пиздец как не любит юнити(изначально на неё планировали переписать)
И решил вот такое безобразие устроить