java - 如果一个 double 的结果能被另一个 double 整除是准确的吗?

标签 java floating-point

我知道 float 和 double 不准确。我有这样的问题。

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

输出为2.0。那么结果到底准确与否。 这个问题是我读《Java 编程语言》这本书时提出的。 它向我展示了一种设置输出比例的方法。

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

该语句将输出设置为小数点后两位。而且我知道浮点运算不准确。那么该语句是否始终有效?

最佳答案

在第一种情况下,结果将恰好是 2.0。原因是 4.0 和 2.0 都可以精确地表示为 Java double 。除法运算符返回最接近实数除法结果的 double ,即 2.0。

在第二种情况下,是否得到准确的结果将取决于面积的值。所有可精确表示的两位小数 double 均以 0.00、0.25、0.50 或 0.75 结尾。剩下的两位小数 double 只能近似。

转换为int会导致不准确,应该用Math.round替换。问题是,比整数稍小的正 double 向下转换为下一个整数,但四舍五入到最接近的整数。这是说明此问题的程序:

导入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 的 double 比它略小,乘以 100 的结果也略小于 29。转换为 int 得到 28,但舍入得到 29。

关于java - 如果一个 double 的结果能被另一个 double 整除是准确的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36731902/

相关文章:

java - Spring MVC Scala 应用程序仅返回index.html页面,其余路由不起作用

java - 使用访问器/ getter 可以更快吗?

c - C中的冒泡排序 float

python - 打印 Python 和 C++ double 时的精度差异

clojure - 检查Clojure中的NaN

java - LogCat 消息的更简洁的着色?

java - 如何从android数据库中删除选中的项目?

java - 如何以所需的方式对 REST API 响应进行排序?

c++ - 小数或 float (SQL Server 和 C++)

javascript - javascript中如何处理大数字