Преобразование строки, содержащей десятичное число в Long

У меня есть следующий пример (ссылка на 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. Но есть ли другой способ?

Ответ 1

Значение 30000.1 является недопустимым длинным значением. Сначала вы можете разобрать двойное значение:

lDurationMillis = (long)Double.parseDouble("30000.1");

Ответ 2

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

Но для чего-либо, что связано с плавающими точками, я должен указать вам на обязательную ссылку Что каждый компьютерный ученый должен знать о арифметике с плавающей точкой,

В java, int и long не имеют дробных частей, поэтому строка, подобная 3000.1, не может быть привязана к одному из них. Он может быть преобразован в float или double, но если вы прочтете вышеприведенную статью, вы поймете, что coversion может быть потерянным, т.е. Если вы вернете это double обратно в String, вы можете не получить оригинал 3000.1 назад. Это будет что-то близкое, для надлежащего устранения близких, но может быть не так.

Если вы хотите использовать точную точность, то BigDecimal является вашим другом. Это будет намного медленнее, чем число, но будет точным.

Ответ 3

В этом случае вы можете использовать BigDecimal:

BigDecimal bd = new BigDecimal("30000.1");
long l = bd.setScale(0, BigDecimal.ROUND_HALF_UP).longValue();
System.out.println(l);

Ответ 4

Потому что долго не может иметь дробную часть, вы можете преобразовать ее в двойную, а затем бросить ее на длительное игнорирование дробной части

Ответ 5

Вы можете выполнять обработку 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