加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 从double转换为int并不总是只是放弃小数部分

发布时间:2020-12-14 05:41:35 所属栏目: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 30
我正在试验我在这里找到的代码 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的转换不总是只是放弃双倍的小数部分,如这里所述: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 !!!

那么现在我正在寻找一个解释这个行为?

解决方法

也许你会惊讶于这样的事实
System.out.println(131072.99999999999); // -> 131073 !!!

你不必将事件转换成int.

在Java(和其他语言)中也有双重表示的问题.系统不像人类那样使用’decimal’部分.

这里有很长的解释:
http://en.wikipedia.org/wiki/Floating_point

但简而言之,双重值就是存储少部分的东西来获得最终的结果(像-1.23 * 10 ^ -15).而且,对于这些给定的数字,您的空间只能有限.所以最后你不能完全代表Double.MAX_VALUE和Double.MIN_VALUE中的每个数字.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读