如果double的结果被另一个double整除是准确的?

时间:2016-04-20 00:45:54

标签: java floating-point

我知道浮动和双重不准确。我有这样的问题。

double a=4.0/2.0;
System.out.println(a);

输出为2.0。所以结果是否准确。 问题来自于我阅读Java编程语言一书。 它向我展示了一种设置输出比例的方法。

System.out.println((int)(area*100)/100.0);

语句将输出设置为两位小数。我知道浮点运算不准确。声明总是可以工作吗?

1 个答案:

答案 0 :(得分:1)

在第一种情况下,结果将是2.0。原因是4.0和2.0都可以完全代表Java加倍。除法运算符返回与实数除法结果最接近的两倍,即2.0。

在第二种情况下,您是否得到确切结果将取决于区域的值。所有可精确表示的两位小数的双精度数以.00,.25,.50或.75结尾。其余两位小数的双打只能近似。

转换为int导致不准确,应由Math.round替换。问题是,一个正整数略小于一个整数,转换为下一个整数,但舍入到最接近的整数。这是一个说明此问题的程序:

import java.math.BigDecimal;

public class Test {
  public static void main(String[] args) {
    double area = 0.29;
    System.out.println(new BigDecimal(area));
    System.out.println(new BigDecimal(area*100));
    System.out.println(new BigDecimal((int)(area*100)/100.0));
    System.out.println((int)(area*100)/100.0);
    System.out.println(Math.round(area*100)/100.0);
  }
}

输出:

0.289999999999999980015985556747182272374629974365234375
28.999999999999996447286321199499070644378662109375
0.2800000000000000266453525910037569701671600341796875
0.28
0.29

最接近0.29的两倍略小于它,乘以100的结果也略小于29.铸造到int得到28,但是舍入得到29。