Ответ 1
Значение 30000.1
является недопустимым длинным значением. Сначала вы можете разобрать двойное значение:
lDurationMillis = (long)Double.parseDouble("30000.1");
У меня есть следующий пример (ссылка на ideone).
long lDurationMillis = 0;
lDurationMillis = Long.parseLong("30000.1");
System.out.print("Play Duration:" + lDurationMillis);
Он выдает исключение:
Exception in thread "main" java.lang.NumberFormatException: For input string: "30000.1"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48)
at java.lang.Long.parseLong(Long.java:419)
at java.lang.Long.parseLong(Long.java:468)
at Main.main(Main.java:9)
Но почему это не позволяет мне преобразовать это число в строку напрямую? Я могу преобразовать число в целое число и преобразовать в double. Но есть ли другой способ?
Значение 30000.1
является недопустимым длинным значением. Сначала вы можете разобрать двойное значение:
lDurationMillis = (long)Double.parseDouble("30000.1");
В заголовке указано, что преобразование строки в длинный, первый вопрос заключается в том, чтобы скрыть число до строки, следующее утверждение о преобразовании числа в целое в строку. Я путаюсь.
Но для чего-либо, что связано с плавающими точками, я должен указать вам на обязательную ссылку Что каждый компьютерный ученый должен знать о арифметике с плавающей точкой,
В java, int
и long
не имеют дробных частей, поэтому строка, подобная 3000.1
, не может быть привязана к одному из них. Он может быть преобразован в float
или double
, но если вы прочтете вышеприведенную статью, вы поймете, что coversion может быть потерянным, т.е. Если вы вернете это double
обратно в String
, вы можете не получить оригинал 3000.1
назад. Это будет что-то близкое, для надлежащего устранения близких, но может быть не так.
Если вы хотите использовать точную точность, то BigDecimal является вашим другом. Это будет намного медленнее, чем число, но будет точным.
В этом случае вы можете использовать BigDecimal:
BigDecimal bd = new BigDecimal("30000.1");
long l = bd.setScale(0, BigDecimal.ROUND_HALF_UP).longValue();
System.out.println(l);
Потому что долго не может иметь дробную часть, вы можете преобразовать ее в двойную, а затем бросить ее на длительное игнорирование дробной части
Вы можете выполнять обработку NumberFormat, как показано ниже:
long lDurationMillis = 0;
try{
NumberFormat nf = NumberFormat.getInstance();
lDurationMillis = nf.parse("30000.1").longValue();
System.out.print("Play Duration:" + lDurationMillis);
}catch(ParseException e)
{
e.printStackTrace();
}
Выход:
Play Duration:30000