黑马程序员技术交流社区

标题: 求教,关于运行时数学运算精度的问题。 [打印本页]

作者: 草帽    时间: 2013-7-5 13:48
标题: 求教,关于运行时数学运算精度的问题。
本帖最后由 草帽 于 2013-7-5 17:07 编辑
  1. public class DoubleTimesDemo{
  2.     public static void main(String args[]){
  3.         System.out.println(0.05*3);
  4.     }
  5. }
复制代码
以上是一个再简单不过的小demo,可运行结果怎么却不尽如人意?答案为0.15000000000000002???
求教数学运算中的精度问题,及本例的解决方法,谢谢。

捕获.PNG (10.9 KB, 下载次数: 0)

捕获.PNG

作者: 哪颗最亮的星星    时间: 2013-7-5 14:02
你最好先定义一个double 类型的变量,
double d=0.5*3;
System.out.println(d);
作者: 王靖远    时间: 2013-7-5 14:07
原理我不清楚。浮点数默认的是double类型 用float类型就能得到你想要的结果了
System.out.println(0.05f*3f);
作者: 哪颗最亮的星星    时间: 2013-7-5 14:14
不好意思看错,
作者: denghui1010    时间: 2013-7-5 14:14
二楼说的不对,精度损失问题在浮点数运算中确实存在,很多编程语言中都有这样的问题,主要是浮点数的存储方式造成的,解决也挺麻烦....我实在不想打那么多字,楼主百度一看看,很多这方面的文章
作者: 哪颗最亮的星星    时间: 2013-7-5 14:43
你把这段代码试下
double d=0.05*3;
DecimalFormat df = new DecimalFormat("0.00");
d=Double.parseDouble(df.format(d));
System.out.println(d);
作者: denghui1010    时间: 2013-7-5 14:49
存储一个浮点数,首先要将该数更改为二进制的科学计数法表示
整数部分就不说了,小数部分如下:
算法是乘以2直到没有了小数为止,举例0.05
0.05*2=0.10    取整数部分0
0.10*2=0.20                   0
0.20*2=0.40                     0
0.40*2=0.80                     0
0.80*2=1.60                     1
0.60*2=1.20                     1
0.20*2=0.40                     0
0.40*2=0.80                     0
0.80*2=1.60                     1
0.60*2=1.20                     1
.......................................0.15二进制表示(从上往下):00001100110011.....
也就是说*2永远不可能消灭小数部分,很显然,小数的二进制表示是不可能精确的,其实就像十进制不能准确的表示出1/3一样,二进制也不能准确的表示1/10,所以精度丢失的问题就产生了,打得我都累了...
作者: lanbuohan    时间: 2013-7-5 14:56
你java里你这么写是不能办证数据的完整进度的,它都是近似,就像在数学中3/100*100,应该为3,但在java不时这样的,如果你像做
作者: lanbuohan    时间: 2013-7-5 15:04
精确计算,有一个API是进行精确计算的,BigDecimal  你去看看这个的帮助文档,就能解决你说的问题了

作者: 草帽    时间: 2013-7-5 15:22
denghui1010 发表于 2013-7-5 14:14
二楼说的不对,精度损失问题在浮点数运算中确实存在,很多编程语言中都有这样的问题,主要是浮点数的存储方 ...

谢谢,看了几个,好麻烦。。。
作者: 草帽    时间: 2013-7-5 15:23
lanbuohan 发表于 2013-7-5 15:04
精确计算,有一个API是进行精确计算的,BigDecimal  你去看看这个的帮助文档,就能解决你说的问题了
...

谢谢,找找看。
作者: 杨兴庭    时间: 2013-7-5 16:52
为了更好的维护论坛的学习氛围,如果您的的问题“已经解决”请即时联系版主将帖子状态改成“已解决”

-------------------坚持学习,黑马因你而精彩---------------




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2