Java строка для двойного преобразования - PullRequest
1 голос
/ 01 июня 2010

Я читал в сети о проблемах с обработкой типов float и double в Java. К сожалению, изображение до сих пор не ясно. Следовательно, я прошу здесь прямо. (

Моя таблица MySQL содержит различные столбцы DECIMAL(m,d). Значение m может варьироваться от 5 до 30. d остается постоянным на уровне 2.

Вопрос 1.

Какой эквивалентный тип данных я должен использовать в Java для работы (т.е. хранения, извлечения и обработки) с размером значений в моей таблице? (Я согласился с двойным - отсюда и этот пост).

Вопрос 2.

При попытке разобрать double из строки я получаю ошибки

Double dpu = new Double(dpuField.getText());

например -

"1" -> java.lang.NumberFormatException: empty String
"10" -> 1.0
"101" -> 10.0
"101." -> 101.0
"101.1" -> 101.0
"101.19" -> 101.1

Что я делаю не так? Как правильно преобразовать строку в двойное значение? И какие меры я должен предпринять, чтобы выполнить операции с такими значениями?

EDIT

Это код -

    System.out.println(dpuField.getText());
    Double dpu = new Double(dpuField.getText());
    System.out.println(dpu);

Да, проблема заключается в том, что getText() сообщает о неверном значении dpuField. Этот метод вызывается для события JTextField keyTyped. Так что здесь не так?

РЕДАКТИРОВАТЬ 2

Глядя на: http://journals.ecs.soton.ac.uk/java/tutorial/post1.0/ui/keylistener.html Видимо, keyTyped() не дает мне код ключа. Мне придется переключиться на keyRealeased()

Ответы [ 4 ]

5 голосов
/ 01 июня 2010

Какой эквивалентный тип данных я должен использовать в Java для работы (т.е. хранения, извлечения и обработки) с размером значений в моей таблице? (Я согласился с двойным - отсюда и этот пост).

Поскольку это поле DECIMAL, вам следует отдать предпочтение java.math.BigDecimal. Вы можете сохранить его в БД, используя PreparedStatement#setBigDecimal(), и вы можете извлечь его из БД, используя ResultSet#getBigDecimal().

При попытке разобрать double из строки я получаю ошибки

Это не может быть правдой. Проблема лежит где-то еще. Возможно, это просто не возвращает данные, которые вы ожидаете получить, или вы не используете / отлаживаете значения, которые вы ожидаете получить.

4 голосов
/ 01 июня 2010
  1. если вам нужна точная точность без ошибок округления, вы должны использовать BigDecimal.

  2. Ваш код выглядит хорошо - может быть, dpuField.getText() каким-то образом вырезает последний символ из строковых значений, которые вы перечислили выше?

Обновление : вы говорите

Да, проблема заключается в том, что getText() сообщает о неверном значении dpuField. Этот метод вызывается для события JTextField keyTyped.

Может ли быть так, что getText() возвращает значение поля до , к которому фактически добавлен последний введенный ключ?

1 голос
/ 01 июня 2010

Вопрос1: Плохо было бы отображать столбцы DECIMAL в Double, обычно BigDecimal - правильный тип.http://java.sun.com/j2se/1.3/docs/guide/jdbc/getstart/mapping.html#1055175

Вопрос 2: Вы делаете что-то не так;перед преобразованием выведите значение String.

1 голос
/ 01 июня 2010

Для десятичной дроби я полагаю, что вы рискуете потерять точность, если не используете BigDecimal на стороне Java, поскольку некоторые десятичные дроби не могут быть сохранены как двоичная дробь.* над конструктором, но это правильный путь.Что-то еще должно происходить (т.е. я сомневаюсь, что это фактические значения String, которые вы передаете).

...