-3

我有两个double计数器,我根据某些标准递增。计数器将以 1 或 0.01 递增,并将结果汇​​总在一起,得到序列号1.001.01、等。由于 的性质,1.02我得到的结果类似于1.01999999999或,这是一个预期的条件。1.111111111111double

我正在尝试使用 BigDecimal,尽管Java 文档指出

BigDecimal(double val)
           Translates a double into a BigDecimal which is the exact decimal representation of the double's binary floating-point value.

我无法让代码工作。

            ....
if (condition1) {
    indexNo = indexNo + 1;
    subIndexNo = .00;
} else
    if (condition2) {
        subIndexNo = subIndexNo + .01;
    }
recNo = indexNo + subIndexNo;
BigDecimal record = BigDecimal(double recNo);

来自编译器的错误消息

C:\pathtojava\sync\java\bin>javac ParseWhiData.java
ParseWhiData.java:97: error: '.class' expected
                                BigDecimal record = BigDecimal(double recNo);
                                                                      ^
ParseWhiData.java:97: error: ';' expected
                                BigDecimal record = BigDecimal(double recNo);
                                                                           ^
2 errors

访问 BigDecimal 时我做错了什么?将 double 转换为 Big Demimal 的正确语法是什么,最重要的是,它会1.019999999999变成1.02

4

2 回答 2

5

BigDecimal(以及 Java 中的每个对象)都是通过new运算符实例化的。

另外,去掉double构造函数中的关键字,因为你已经定义了一个名为recNo.

改变

BigDecimal record = BigDecimal(double recNo);

BigDecimal record = new BigDecimal(recNo);
于 2013-10-22T15:11:07.607 回答
3

您需要使用其他构造函数BigDecimal(String val)来获得精确的精度:

BigDecimal a = new BigDecimal("4.81");
BigDecimal b = new BigDecimal("0.01");
BigDecimal c = a.add(b);
System.out.println(c);

BigDecimal d = new BigDecimal(4.81);
BigDecimal e = new BigDecimal(0.01);
BigDecimal f = d.add(e);
System.out.println(f);

输出:

4.82
4.81999999999999960940966214906211462221108376979827880859375
于 2013-10-22T15:25:04.897 回答