我有一个GUI,其工作方式如下:有2个按钮和1个textField。 textField用于保存double / float值,其中1个按钮添加一个值(在本例中为0.1),另一个按钮减去(添加-0.1)。
以下是我的以下问题:多次按下其中一个按钮后,结果值的行为不符合我的要求。换句话说,而不是" 1.5"变成" 1.6",它会像" 1.5999998"。我尝试了很多更改(比如更改变量类型和添加/减去的值),但这些都没有效果。这是我的一部分代码:
public void sumTextField(){
try{
if(textField.getText() == "")
textField.setText("0.1");
else{
float aux = Float.parseFloat(textField.getText());
aux += 0.10000000;
textField.setText(String.valueOf(aux));
}
}
catch(NumberFormatException nfe){
nfe.printStackTrace();
JOptionPane.showMessageDialog(null, "Please, provide a valid value in the text field!", "Impossible sum", JOptionPane.INFORMATION_MESSAGE);
}
}
public void subtractTextField(){
try{
if(textField.getText() == "")
textField.setText("-0.1");
else{
float aux = Float.parseFloat(textField.getText());
aux -= 0.10000000;
textField.setText(String.valueOf(aux));
}
}
catch(NumberFormatException nfe){
nfe.printStackTrace();
JOptionPane.showMessageDialog(null, "Please, provide a valid value in the text field!", "Impossible subtraction", JOptionPane.INFORMATION_MESSAGE);
}
}
欢迎任何想法
答案 0 :(得分:2)
您的问题归因于double
和float
的工作方式。
在浮点运算中,计算机只计算到一定的精度,即在这么多小数位后,它只是将数字四舍五入。 0.1
似乎是十进制的一个很好的整数,但在二进制中它是重复的 - 0.0001100110011
等等。对于每次计算,四舍五入使得结果更不准确。请查看this page以获得更详尽的解释。
double
比float
更准确,但它仍然会显示这样的舍入错误。
为了避免这个问题,你可以做两件事之一。首先,正如Jon Skeet在评论中所说,你可以使用像BigDecimal
这样的任意精度算法。
或者,您可以打印出几个小数位,如下所示:
String answer = String.format("%.2f", myNumber);
这会将打印值四舍五入到小数点后两位。
希望这有帮助!