Почему добавление двух десятичных знаков в Javascript дает неправильный результат? [дубликат]

Возможный дубликат:
Не нарушена ли математика 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(); });
    }();
    
    7
    задан Tomaka17 9 August 2010 в 15:59
    поделиться

    2 ответа

    Это довольно распространенная техника в других языках. Почти каждая высокоуровневая функция 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;
    }
    
    3
    ответ дан 7 December 2019 в 16:37
    поделиться

    Я вообще не вижу причин использовать в таком случае switch case. Любой приличный компилятор сгенерирует такой же быстрый код с операторами if, как и с регистром switch.

    if(bar == SOMETHING)
       foo = 5;
    else if(bar == STHNELSE)
       foo = 10;
    
    0
    ответ дан 7 December 2019 в 16:37
    поделиться
    Другие вопросы по тегам:

    Похожие вопросы: