Многие многочисленные дубликаты этого вопроса задают вопрос о влиянии округления с плавающей запятой на конкретные числа. На практике легче понять, как это работает, глядя на точные результаты вычислений, а не просто на чтение. Некоторые языки предоставляют способы сделать это - например, преобразование float
или double
в BigDecimal
в Java.
Так как это вопрос, связанный с языком, ему нужны языковые агностические инструменты, такие как как Десятичный преобразование с плавающей запятой .
Применяя его к числам в вопросе, рассматриваемым как удваивает:
0,1 преобразуется в 0,1000000000000000055511151231257827021181583404541015625,
0,2 преобразуется в 0.200000000000000011102230246251565404236316680908203125,
0,3 конвертируется в 0,29999999999999999989897769753748434595763683319091796875 и
0,30000000000000004 преобразуется в 0,3000000000000000444089209850062616169452667236328125.
Добавление первых двух чисел вручную или в десятичный калькулятор, такой как Full Precision Calculator , показывает точную сумму фактических входов: 0.3000000000000000166533453693773481063544750213623046875.
Если округлить до эквивалента 0,3, ошибка округления будет 0.0000000000000000277555756156289135105907917022705078125. Округление до эквивалента 0,30000000000000004 также дает ошибку округления 0,0000000000000000277555756156289135105907917022705078125.
Возвращаясь к конвертеру с плавающей запятой, необработанный шестнадцатеричный показатель для 0.30000000000000004 равен 3fd3333333333334, который заканчивается четной цифрой и, следовательно, является правильным результатом.
Динамически не удается разрешить ваши зависимости, так как imports
предназначены для статического анализа. Однако вы, вероятно, можете использовать некоторые require
здесь, например:
for (let foo in bar) {
if (bar.hasOwnProperty(foo)) {
const Baz = require(foo).Baz;
}
}
Требование не решит вашу проблему, так как это синхронный вызов. Есть несколько вариантов, и все они связаны с
В ECMA Script поддерживается поддержка ленивых модулей загрузки с помощью SystemJS. Это, конечно, не поддерживается во всех браузерах, поэтому вы можете использовать JSPM или системную шину SystemJS.
Теперь у нас есть предложение динамического импорта с ECMA. Это находится на этапе 2. Это также доступно как babel-preset .
Ниже приведен способ сделать условный рендеринг в соответствии с вашим случаем.
if (foo === bar) {
import('./Baz')
.then((Baz) => {
console.log(Baz.Baz);
});
}
Это в основном возвращает обещание. Ожидается, что ожидается, что модуль обещания получит модуль. В предложении также есть такие вещи, как множественный динамический импорт, импорт по умолчанию, импорт js-файла и т. Д. Здесь вы можете найти более подробную информацию о динамических импортах здесь .