管理double和float值的奇怪行为(Java)

时间:2014-08-05 10:37:20

标签: java

我有一个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);
     }
}

欢迎任何想法

1 个答案:

答案 0 :(得分:2)

您的问题归因于doublefloat的工作方式。

在浮点运算中,计算机只计算到一定的精度,即在这么多小数位后,它只是将数字四舍五入。 0.1似乎是十进制的一个很好的整数,但在二进制中它是重复的 - 0.0001100110011等等。对于每次计算,四舍五入使得结果更不准确。请查看this page以获得更详尽的解释。

doublefloat更准确,但它仍然会显示这样的舍入错误。

为了避免这个问题,你可以做两件事之一。首先,正如Jon Skeet在评论中所说,你可以使用像BigDecimal这样的任意精度算法。

或者,您可以打印出几个小数位,如下所示:

String answer = String.format("%.2f", myNumber);

这会将打印值四舍五入到小数点后两位。

希望这有帮助!