java - 从 double 转换为 int 并不总是只删除小数部分

标签 java

我正在试验我在这里找到的代码 The Java Specialists' Newsletter .

public class MeaningOfLife {
  public static String findOutWhatLifeIsAllAbout() {
  int meaning = 0;
  for (int i = 0; i < 10; i++) {
    for (int j = 0; j < 20; j++) {
      for (int k = 0; k < 300; k++) {
        for (int m = 0; m < 7000; m++) {
          meaning += Math.random() + 1;
        }
      }
    }
  }
  return String.valueOf(meaning).replaceAll("0*$", "");
  }

public static void main(String[] args) {
  System.out.println(findOutWhatLifeIsAllAbout());
}
}

一旦我意识到 compound assignment operator 存在隐式转换,“它打印什么”这个问题的答案就显而易见了+=.

但它打印出类似:420000006 或 420000007, 而不是(预期的)420000000(或“42”,删除尾随零后)。

所以这表明从 double 到 int 的转换并不总是只是删除 double 的小数部分,如下所述:How to cast a double to an int in Java?

所以我做了一些试验,下面是我发现的一个例子:

System.out.println((int)  (131070.99999999999)); // -> 131070
System.out.println((int)  (131071.99999999999)); // -> 131071
System.out.println((int)  (131072.99999999999)); // -> 131073 !!!
System.out.println((int)  (131073.99999999999)); // -> 131074 !!!


System.out.println((int)  (16382.999999999999)); // -> 16382
System.out.println((int)  (16383.999999999999)); // -> 16383
System.out.println((int)  (16384.999999999999)); // -> 16385 !!!
System.out.println((int)  (16385.999999999999)); // -> 16386 !!!

...所以现在我正在寻找对这种行为的解释???

最佳答案

许多十进制值不可能是 double 值。在使用它们之前,首先必须将它们压缩到最接近的 double 值。

示例:16384.999999999999 没有精确的 double 表示。最接近的两个值是 16384.9999999999963620211929082870483398437516385.0。向下压缩会产生大约 0.000000000003 的差异,而向上压缩会产生 0.000000000001 的差异 - 向上会产生更接近的值,因此这就是它的解释。

关于java - 从 double 转换为 int 并不总是只删除小数部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8403181/

相关文章:

java - InnerHTML 没有给 servlet 带来值(value)

java - Hibernate 在一对多映射上添加 where 子句

java - Guava 缓存生成器 : imply additional conditions to entity removal

java - 在 Spring boot 中使用 mysql join 作为一个 java 对象返回两个表的数据

java - PowerMock - 禁止构造函数但设置私有(private)最终字段

Java - 特定的数据结构

java - CVS - 比较时创建 Zip

java - 需要像在 Java 中一样在 Objective C 中生成 HMAC SHA256 哈希

java - 通过存储uri获取azure订阅id

java - 在同一目标中使用拖放操作对 WebElement 进行重新排序