Чтобы предложить лучшее решение, я могу сказать, что обнаружил следующий метод:
parseFloat((0.1 + 0.2).toFixed(10)) => Will return 0.3
Позвольте мне объяснить, почему это лучшее решение. Как упоминалось выше в других ответах, рекомендуется использовать готовые для использования функции Javascript toFixed () для решения проблемы. Но, скорее всего, вы столкнетесь с некоторыми проблемами.
Представьте, что вы собираетесь добавить два числа с плавающей запятой, такие как 0.2
и 0.7
, вот оно: 0.2 + 0.7 = 0.8999999999999999
.
Ваш ожидаемый результат 0.9
означает, что в этом случае вам нужен результат с точностью до 1 цифры. Поэтому вы должны были использовать (0.2 + 0.7).tofixed(1)
, но вы не можете просто указать определенный параметр toFixed (), поскольку он зависит от заданного числа, например
`0.22 + 0.7 = 0.9199999999999999`
. В этом примере вам нужна точность в 2 цифры так что это должно быть toFixed(2)
, так что должно быть параметром для каждого заданного числа с плавающей запятой?
Вы могли бы сказать, что пусть это будет 10 в каждой ситуации:
(0.2 + 0.7).toFixed(10) => Result will be "0.9000000000"
Черт! Что вы собираетесь делать с этими нежелательными нулями после 9? Пришло время преобразовать его в float, чтобы сделать его по вашему желанию:
parseFloat((0.2 + 0.7).toFixed(10)) => Result will be 0.9
Теперь, когда вы нашли решение, лучше предложить его как функцию:
function floatify(number){
return parseFloat((number).toFixed(10));
}
function addUp(){
var number1 = +$("#number1").val();
var number2 = +$("#number2").val();
var unexpectedResult = number1 + number2;
var expectedResult = floatify(number1 + number2);
$("#unexpectedResult").text(unexpectedResult);
$("#expectedResult").text(expectedResult);
}
addUp();
input{
width: 50px;
}
#expectedResult{
color: green;
}
#unexpectedResult{
color: red;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input id="number1" value="0.2" onclick="addUp()" onkeyup="addUp()"/> +
<input id="number2" value="0.7" onclick="addUp()" onkeyup="addUp()"/> =
<p>Expected Result: <span id="expectedResult"></span></p>
<p>Unexpected Result: <span id="unexpectedResult"></span></p>
Вы можете использовать его следующим образом:
var x = 0.2 + 0.7;
floatify(x); => Result: 0.9
Вы можете использовать размеры продолжения A
и B
с np.newaxis/None
, чтобы ввести broadcasting
для векторизованного решения так же -
A[...,None]*B[:,None,:]
Объяснение: np.outer(np.transpose(A[i]), B[i])
в основном выполняет элементное умножение между столбчатой версией A[i]
и B[i]
. Вы повторяете это для всех строк в A
для сопоставления строк в B
. Обратите внимание, что np.transpose()
, похоже, не оказывает никакого влияния, поскольку np.outer
заботится о предполагаемых элементарных умножениях.
Я бы описал эти шаги в векторизованном языке и, таким образом, реализовать так:
A
и B
, чтобы сформировать фигуры 3D
для обоих из них, чтобы мы сохранили axis=0
и сохранили как axis=0
в обеих этих расширенных версиях. Таким образом, нам остается решать две последние оси. axis=1
из A в своей исходной 2D-версии на axis=1
в своем 3D
, тем самым создавая одномерное измерение в axis=2
для расширенной версии A
. 3D
A
должно совпадать с элементами из axis=1
в оригинальной 2D
версии B
, чтобы broadcasting
произошло. Таким образом, расширенная версия B
имела бы элементы из axis=1
в своей 2D-версии, которые были бы нажаты на axis=2
в ее версии 3D
, тем самым создавая одномерное измерение для axis=1
. Наконец, расширенные версии: A[...,None]
& amp; B[:,None,:]
, умножив, кто даст нам желаемый результат.