为什么在java中一个int乘一个double的结果与正确结果有偏差!!例如:70000 * 0.3571 = 24997.000000000003,正确答案应该就是24997 多谢各位!! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 首先说明,这个计算在我得jvm上结果是:24996.999999999996。这个和浮点数在计算机中的表示方法有关。我不太记得双精度浮点数的表示的具体方法了,这里只是做一个举例说明。假如双精度浮点数在计算机中占64位,其中32位用来保存小数信息,32位用来表示指数。那么0.3571在计算机中的表示方法就是:10110110110101011100111110101010 × 2^-33也就是10110110110101011100111110101010 乘以2的-33次方。而0.3571换算成二进制的后应该是1011011011010101110011111010101011001101100111101 × 2^-50我们放在一起比较以下10110110110101011100111110101010 × 2^-331011011011010101110011111010101011001101100111101 × 2^-50可以看到,实际上在将0.3571转换成双精度浮点数的时候,是有精度的损失的,有误差存在的,只不过误差很小。因此,在计算70000 × 0.3571的时候,误差就会被放大70000倍。在将超出精度范围的尾数丢弃的时候,是直接丢弃还是四舍五入,应该和不同的JVM的实现有关。因此在不同的JVM上计算出来的结果会有差异。 http://blog.csdn.net/treeroot/archive/2004/09/05/95071.aspx 关闭次窗口,而且要保留主窗口。 熟悉3DES加密的帮帮忙 为什么int n=0;n=n++;打印n等于0 为什么要这么写??? 请问一个类的调用的问题 java相互编译问题求救 请问在CSDN有没有人参加过深圳深蓝软件的j2ee培训,效果如何? 关于控制台清屏的问题 请问如何抓取google搜索结果的页面? java 捕获电脑当前光标的位置 求一段简单的java代码,在线等,谢谢 (小问题求助)如何让变量在程序结束后保留结果
这个和浮点数在计算机中的表示方法有关。
我不太记得双精度浮点数的表示的具体方法了,这里只是做一个举例说明。
假如双精度浮点数在计算机中占64位,其中32位用来保存小数信息,32位用来表示指数。那么0.3571在计算机中的表示方法就是:
10110110110101011100111110101010 × 2^-33
也就是10110110110101011100111110101010 乘以2的-33次方。
而0.3571换算成二进制的后应该是
1011011011010101110011111010101011001101100111101 × 2^-50
我们放在一起比较以下
10110110110101011100111110101010 × 2^-33
1011011011010101110011111010101011001101100111101 × 2^-50
可以看到,实际上在将0.3571转换成双精度浮点数的时候,是有精度的损失的,有误差存在的,只不过误差很小。
因此,在计算70000 × 0.3571的时候,误差就会被放大70000倍。
在将超出精度范围的尾数丢弃的时候,是直接丢弃还是四舍五入,应该和不同的JVM的实现有关。因此在不同的JVM上计算出来的结果会有差异。