Возможный дубликат:
Не нарушена ли математика JavaScript?Почему JS испортил эту простую математику?
console.log (.1 + .2) // 0.3000000000000004 console.log ( .3 + .6) // 0.8999999999999999
Первый пример больше правильного результата, а второй меньше. ??? !! Как вы это исправите? Вы должны всегда преобразовывать десятичные числа в целые числа перед выполнением операций? Должен ли я беспокоиться только о добавлении (* и /, похоже, в моих тестах такая же проблема не возникает)?
Я искал ответы во многих местах. Некоторые учебные пособия (например, формы корзины покупок) делают вид, что проблемы не существует, и просто добавляют значения вместе. Гуру предоставляют сложные подпрограммы для различных математических функций или упоминают, что JS «делает плохую работу» мимоходом, но я пока не вижу объяснения. переключатель (бар) {case НЕЧТО: foo = 5; перемена; case STHNELSE: foo = 10; перемена; ... не видите?
Считаете ли вы его лучше, чем приведенный выше? g ++, кажется, встроен в функцию, но думаете ли вы, что все компиляторы это сделают? РЕДАКТИРОВАТЬ: это то, что я имею в виду с помощью "DirectX functions"
_xAudio2 = [&]() -> std::shared_ptr
{ IXAudio2* ptr = nullptr; if (FAILED(XAudio2Create(&ptr, xAudioFlags, XAUDIO2_DEFAULT_PROCESSOR))) throw std::runtime_error("XAudio2Create failed"); return std::shared_ptr (ptr, [](IUnknown* ptr) { ptr->Release(); }); }();
Это довольно распространенная техника в других языках. Почти каждая высокоуровневая функция Scheme определяется в терминах немедленно вызываемых лямбда-выражений.
В JavaScript это основа «шаблона модуля», например
var myModule = (function() {
// declare variables and functions (which will be "private")
return {
// populate this object literal with "public" functions
};
})();
Таким образом, анонимная функция объявляется и немедленно вызывается, так что любые внутренние детали скрыты, и только возвращаемое значение отображается извне.
Единственным недостатком является то, что при случайном чтении кода операторы return
будут казаться возвращающимися из внешней функции (во время лямбда-войн Java по этому поводу были серьезные споры). Но это просто то, к чему вы должны привыкнуть, если в вашем языке есть лямбды.
В императивном языке, таком как C ++, есть много языковых функций, которые выиграют от возможности возвращать значение (а не похожи на функцию void
). Например, , если
имеет альтернативу, третичный оператор expr? а: б
.
В Ruby можно оценивать практически все операторы, поэтому нет необходимости в отдельном синтаксисе, в котором может быть предоставлено возвращаемое значение. Если бы C ++ работал таким образом, это означало бы что-то вроде:
auto result = try
{
getIntegerSomehow();
}
catch (const SomeException &)
{
0;
}
Я вообще не вижу причин использовать в таком случае switch case. Любой приличный компилятор сгенерирует такой же быстрый код с операторами if, как и с регистром switch.
if(bar == SOMETHING)
foo = 5;
else if(bar == STHNELSE)
foo = 10;