比较java中的十进制值

时间:2015-01-01 21:36:10

标签: java scientific-notation

我试图从逗号分隔的CVS文件中获取某些值。到目前为止,这是我的代码:

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.math.BigDecimal;

class A {

    public static void main(String args[]){

        BufferedReader br = null;
        try {

            String sCurrentLine;

            br = new BufferedReader(new FileReader("sample.csv"));

            double start = 20659200000.000000;
                    DecimalFormat df = new DecimalFormat("#.######");
                    df.format(start);
                    int i = 0;
                    while ((sCurrentLine = br.readLine()) != null) {
                            String[] tmp = sCurrentLine.split(",");
                            //System.out.println(tmp[0]);
                    BigDecimal bg1, bg2;
                    bg1 = new BigDecimal(Double.parseDouble(new
                         BigDecimal(tmp[0]).toPlainString()));
                    bg2 = new BigDecimal(start);
                            if(bg1.equals(bg2))
                            {
                                    //System.out.println("Inside if");
                                    //System.out.println(tmp[0]);
                                    System.out.println(sCurrentLine);
                                    start = start + 0.000100;
                                    df.format(start);
                                    i = i + 1;
                            }
                    }

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                    if (br != null)br.close();
            } catch (IOException ex) {
                    ex.printStackTrace();
            }
        }
    }
}

我正在尝试读取这样的示例文件:

20659200000.000000,1.389320
20659200000.000000,1.318758
20659200000.000000,1.361239
20659200000.000000,1.379709
20659200000.000100,1.389320
20659200000.000100,1.357912
20659200000.000100,1.365672
20659200000.000100,1.374912
20659200000.000100,1.318937
20659200000.000100,1.355331
20659200000.000200,1.370660
20659200000.000200,1.365118
20659200000.000200,1.364933

我想从左列中只选择一个值(第一个)。 目前if条件只被访问一次。

我更改了if条件和equals方法,现在它只适用于前三次迭代。更新起始值时出错。

有什么想法吗? 感谢。

5 个答案:

答案 0 :(得分:1)

以下是您在阅读循环中应该做的事情:

while ((sCurrentLine = br.readLine()) != null) {
    String[] tmp = sCurrentLine.split(",");
    // here only use tmp[0] if you just want to pick the first column
    // you could parse it to a double and calculate the stuff you want
    System.out.println(tmp[0]);
}

答案 1 :(得分:1)

您无法以这种方式比较两个double。转换为double时精度会下降,这意味着两个看似相等的值可能最终会不同,而两个看起来不同的值可能最终会相同。

您应该将所需的值存储为String,然后将您正在阅读的String值与您存储的值进行比较,或者否则使用BigDecimal.equals()方法测试两个BigDecimal实例之间的相等性。

比较两个String只有在您知道它们以完全相同的格式存储时才会起作用(当然,相同的小数位数等等)。比较两个BigDecimal实例将会有效,前提是您的值可以完全表示为BigDecimal,并且由于您正在从文本文件中读取值,因此确实应该如此!

答案 2 :(得分:1)

实际上,这里if条件将被访问一次,因为在您编写tmp[i]的条件下。在第一次迭代之后,i更改为1.然后在下一次迭代tmp[i]值更改为1.318758,这是第二行的第二列值。

因此情况不满意并且中断。

您可以做的是将int i = 0;置于while条件之后。

答案 3 :(得分:0)

您应该在if语句中使用模数和增量。

但是,为什么不直接使用

访问第一列

因此...

` while ((sCurrentLine = br.readLine()) != null) {

      String[] tmp = sCurrentLine.split(",");
      if(tmp.length > 0){
             System.out.println("The first column is: " + tmp[0]);
      }
}`

答案 4 :(得分:0)

最好这样:

        String start = "20659200000.000000";
        while ((sCurrentLine = br.readLine()) != null) {
            String[] tmp = sCurrentLine.split(",");
            if(tmp[0].equals(start)) {
                System.out.println("Inside if");
            }
        }