我有一个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();
}
}
}
并且决定
答案 0 :(得分:2)
您似乎认为将浮点数转换为String并再次返回可以使其具有一定数量的小数位。这是荒谬的。 FP值没有任何小数位。他们有二进制位置。如果小数部分是2的负幂,例如,这些仅对应于固定的小数位数。 0.5,0.125,0.0625等
答案 1 :(得分:2)
答案 2 :(得分:0)
如果你使用BigDecimal,你实际上可以截断数字,而不是试图使用Float(缺乏)精度。