Чтобы предложить лучшее решение, я могу сказать, что обнаружил следующий метод:
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
Вы можете опустить инструкции импорта и ссылаться на них, используя весь путь. Например:
java.util.Date javaDate = new java.util.Date()
my.own.Date myDate = new my.own.Date();
Но я бы сказал, что использование двух классов с одинаковыми именами и аналогичной функцией обычно не является лучшей идеей, если вы не можете четко ее понять, что есть.
Вы можете импортировать один из них с помощью импорта. Для всех других подобных классов вам необходимо указать Полноценные имена классов. В противном случае вы получите ошибку компиляции.
Например:
import java.util.Date;
class Test{
public static void main(String [] args){
// your own date
my.own.Date myOwndate ;
// util.Date
Date utilDate;
}
}
У меня была такая же проблема, что и я, я упорядочил порядок библиотек в последовательности, например, были java.lang.NullPointerException и javacard.lang.NullPointerException. Я сделал первую в качестве библиотеки по умолчанию, и если вам нужно использовать другую, вы можете явно указать полное имя класса.
Другой способ сделать это - подкласс it:
package my.own;
public class FQNDate extends Date {
}
И затем импортировать my.own.FQNDate в пакетах с java.util.Date.
Да, когда вы импортируете классы с одинаковыми простыми именами, вы должны ссылаться на них по их полностью квалифицированным именам классов. Я бы оставил инструкции импорта, поскольку он дает другим разработчикам представление о том, что находится в файле, когда они работают с ним.
java.util.Data date1 = new java.util.Date();
my.own.Date date2 = new my.own.Date();
Если вам действительно нужно или нужно использовать одно и то же имя класса из двух разных пакетов, у вас есть два варианта: 1-выбрать один для использования в импорте и использовать полное имя другого пользователя:
import my.own.Date;
class Test{
public static void main(String[] args){
// I want to choose my.own.Date here. How?
//Answer:
Date ownDate = new Date();
// I want to choose util.Date here. How ?
//Answer:
java.util.Date utilDate = new java.util.Date();
}
}
2 - всегда используйте полное имя класса:
//no Date import
class Test{
public static void main(String[] args){
// I want to choose my.own.Date here. How?
//Answer:
my.own.Date ownDate = new my.own.Date();
// I want to choose util.Date here. How ?
//Answer:
java.util.Date utilDate = new java.util.Date();
}
}
Если у вас есть собственный класс даты, вы должны отличить его от встроенного класса Date. то почему вы создали свой собственный. Что-то вроде ImmutableDate или BetterDate или NanoDate, даже MyDate укажет, почему у вас есть свой собственный класс даты. В этом случае они будут иметь уникальное имя.
Я попал в эту проблему, когда, например, сопоставлял один класс с другим (например, при переключении на новый набор классов для представления данных человека). В этот момент вам нужны оба класса, потому что это весь смысл кода - сопоставление одного с другим. И вы не можете переименовывать классы в любом месте (опять же, задание должно отображаться, а не менять то, что кто-то еще сделал).
Полностью квалифицированный - это один из способов. Похоже, что на самом деле вы не можете включать оба оператора импорта, потому что Java беспокоится о том, что означает «Person», например.
Этот сценарий не так распространен в реальном программировании, но не слишком странный. Иногда бывает, что два класса в разных пакетах имеют одно и то же имя, и нам нужны оба из них.
Не обязательно, что если два класса имеют одинаковое имя, то оба будут содержать одинаковые функции, и мы должны выбрать только один из них.
Если нам нужны оба, тогда нет никакого вреда в использовании этого. И это тоже неплохая идея программирования.
Но мы должны использовать полностью квалифицированные имена классов (имеющих одно и то же имя), чтобы дать понять, к какому классу мы тоже обращаемся.
:)