java – 从double转换为int并不总是只是放弃小数部分
我正在试验我在这里找到的代码
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, 所以这表明从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’部分. 这里有很长的解释: 但简而言之,双重值就是存储少部分的东西来获得最终的结果(像-1.23 * 10 ^ -15).而且,对于这些给定的数字,您的空间只能有限.所以最后你不能完全代表Double.MAX_VALUE和Double.MIN_VALUE中的每个数字. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- java数据结构实现机器人行走
- java – NoSuchMethodError:com.google.common.base.Stopw
- java – arrayListName.sort(null)做什么?
- java – 使用JodaTime计算保持年份的两个日期之间的月份
- 将Annotation作为超级接口时,java – @SuppressWarnings的值
- the resource is not on the build path of a java project
- java – 为多线程REST API客户端设计
- Java编程子类能否重写父类的静态方法探索
- JAVA用于生成静态页面
- 对自己学习算法,你如何在java中实现元组?