0

我对浮点值的舍入有疑问。

以下代码给了我以下结果:

public class ProductOrder {

  public static void main(String[] args) {
    int q = 48;
    float p = 6.95f;

    System.out.println(q * p);
  }

------
Output: 333.59998

虽然预期的结果应该是 333.6

当我用 49 替换 q 时,没关系,我得到 340,55

4

4 回答 4

2

正如已经指出的那样,BigDecimal 专为精确处理短小数部分特别重要的情况而设计,并且比任何二进制浮点格式更适合这些情况。

第二个最好的解决方案是在例如整数美分中工作,并且仅在显示期间插入小数点。

如果您必须使用二进制浮点,则 double 通常是比 float 更好的选择,除非您要处理大量数字并且知道 float 具有足够的精度。

对于输出,如果您期望结果的小数点后不超过 2 个小数位,您可以使用 DecimalFormat 进行相应的舍入:

导入 java.text.DecimalFormat;

public class Test {
  public static void main(String[] args) {
    DecimalFormat df = new DecimalFormat("#0.##");
    int q = 48;
    float p = 6.95f;
    System.out.println(df.format(q * p));
  }
}

打印 333.6

于 2013-08-05T20:00:12.053 回答
0

默认格式会产生最少数量的数字,这些数字是从其邻居中区分数字所需的。这意味着如果结果由于舍入误差而略微偏离,您将获得“丑陋”的输出。

解决此问题的一种方法是使用精确算术(BigDecimal 或整数算术)。另一个是舍入输出,例如:

System.out.printf("%f", p*q);
于 2013-08-05T20:00:47.870 回答
0

该数字333.6不能完全表示为 a float,其精度高达 6 位小数。当您尝试以太高的精度(8 位)打印它时,会显示潜在的舍入误差。

double具有高达 15 位的精度。

但是,正如其他人指出的那样,如果您正在处理财务计算,您应该在BigDecimal.

作为参考,您可以使用IEEE-754 浮点转换float网站来查看对于任何给定的十进制数,它在和中的确切表示方式double

于 2013-08-05T20:04:53.763 回答
-1

这里的问题是浮点会受到浮点精度误差的影响。你可以使用double两倍的精度(你最终还是会得到错误,但它比使用更准确float)。

例如

public static void main(String[] args) {
    int q = 48;
    double p = 6.95;

    System.out.println(q * p);
}

这将给出 333.6。

于 2013-08-05T18:55:54.987 回答