Проблема преобразования String-> Float-> String - PullRequest
0 голосов
/ 04 июля 2011

У меня есть JTable, где я ввожу некоторые значения. Это функция слушателя, чтобы узнать, были ли внесены какие-либо изменения в значения, чтобы я мог их обновить. Значения должны иметь указанный формат (#. ###), поэтому я делаю это исправление для округления числа с плавающей запятой до 3 десятичных знаков, если клиент вводит больше 3.

    private class CambioTablaPretratamientoListener implements TableModelListener{
    public void tableChanged(TableModelEvent e){
        try{
            if(enviarDatosADispositivo){
                TableModel model = (TableModel)e.getSource();
                float value = Float.parseFloat((String)model.getValueAt(e.getLastRow(), 1));
                DecimalFormat dec = new DecimalFormat("#.###");
                String aux = dec.format(value);
                if(model.getValueAt(e.getLastRow(), 1).equals(aux))
                    return;
                else
                    model.setValueAt(aux, e.getLastRow(), 1);
                value = Float.parseFloat(aux);

                String nombreAtributo = (String)model.getValueAt(e.getLastRow(), 0);

                nodoAModificar.setPretratamientUserParameter(nombreAtributo, value);     
            }
        }catch(BusinessException ex){
            ex.printStackTrace();
        }
    }
}

Сначала кажется, что код работает, потому что он округляется, а число появляется в таблице, но значение не обновляется. Я думаю, что я делаю что-то не так с DecimalFormat, потому что, если я оставлю функцию, как эта, она работает:

    private class CambioTablaPretratamientoListener implements TableModelListener{
    public void tableChanged(TableModelEvent e){
        try{
            if(enviarDatosADispositivo){
                TableModel model = (TableModel)e.getSource();
                float value = Float.parseFloat((String)model.getValueAt(e.getLastRow(), 1));
                String nombreAtributo = (String)model.getValueAt(e.getLastRow(), 0);

                nodoAModificar.setPretratamientUserParameter(nombreAtributo, value);     
            }
        }catch(BusinessException ex){
            ex.printStackTrace();
        }
    }
}

И, наконец,

Ответы [ 3 ]

2 голосов
/ 04 июля 2011
2 голосов
/ 04 июля 2011

Вы, кажется, думаете, что преобразование числа с плавающей запятой в строку и обратно может привести к тому, что она будет иметь определенное количество десятичных знаков. Это ошибочно. Значения FP не имеют любых десятичных знаков. У них есть двоичные места. Они соответствуют только фиксированным числам десятичных разрядов, если дробная часть имеет отрицательную степень 2, например 0,5, 0,125, 0,0625 и т. Д.

0 голосов
/ 04 июля 2011

Если вы используете BigDecimal, вы могли бы на самом деле обрезать числа, вместо того, чтобы пытаться использовать точность Float (отсутствие).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...