A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 草帽 中级黑马   /  2013-7-5 13:48  /  1330 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 草帽 于 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

评分

参与人数 1技术分 +1 收起 理由
杜光 + 1 每天提问并回答问题,是对知识的复习和积累.

查看全部评分

11 个回复

倒序浏览
你最好先定义一个double 类型的变量,
double d=0.5*3;
System.out.println(d);
回复 使用道具 举报
原理我不清楚。浮点数默认的是double类型 用float类型就能得到你想要的结果了
System.out.println(0.05f*3f);
回复 使用道具 举报
不好意思看错,
回复 使用道具 举报
二楼说的不对,精度损失问题在浮点数运算中确实存在,很多编程语言中都有这样的问题,主要是浮点数的存储方式造成的,解决也挺麻烦....我实在不想打那么多字,楼主百度一看看,很多这方面的文章
回复 使用道具 举报
你把这段代码试下
double d=0.05*3;
DecimalFormat df = new DecimalFormat("0.00");
d=Double.parseDouble(df.format(d));
System.out.println(d);
回复 使用道具 举报
存储一个浮点数,首先要将该数更改为二进制的科学计数法表示
整数部分就不说了,小数部分如下:
算法是乘以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,所以精度丢失的问题就产生了,打得我都累了...

评分

参与人数 1技术分 +1 收起 理由
赵海洋 + 1 很给力!

查看全部评分

回复 使用道具 举报
你java里你这么写是不能办证数据的完整进度的,它都是近似,就像在数学中3/100*100,应该为3,但在java不时这样的,如果你像做
回复 使用道具 举报
精确计算,有一个API是进行精确计算的,BigDecimal  你去看看这个的帮助文档,就能解决你说的问题了
回复 使用道具 举报
denghui1010 发表于 2013-7-5 14:14
二楼说的不对,精度损失问题在浮点数运算中确实存在,很多编程语言中都有这样的问题,主要是浮点数的存储方 ...

谢谢,看了几个,好麻烦。。。
回复 使用道具 举报
lanbuohan 发表于 2013-7-5 15:04
精确计算,有一个API是进行精确计算的,BigDecimal  你去看看这个的帮助文档,就能解决你说的问题了
...

谢谢,找找看。
回复 使用道具 举报
为了更好的维护论坛的学习氛围,如果您的的问题“已经解决”请即时联系版主将帖子状态改成“已解决”

-------------------坚持学习,黑马因你而精彩---------------
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马