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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 一碗小米周 于 2013-11-1 21:47 编辑
  1. public static double getDouble(double d){
  2.                
  3.                 return d-Math.floor(d);
  4.                
  5.         }
复制代码
请各位看下,上面的小方法是给定的一个小数返回其小数部分值。我试了下,如果比如给d=3.14,那么3.14-3.0的结果为什么会是0.14000000000000012呢?是因为返回值类型为double吗?谢谢。

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

6 个回复

倒序浏览
  1. public static double getDouble(double d){
  2.             
  3.             return d-(int)d;
  4.             
  5.     }
复制代码
也许是精度的问题
使用这个方法,就能实现你的功能,希望对你有帮助,

回复 使用道具 举报
杨增坤 发表于 2013-11-1 14:59
也许是精度的问题
使用这个方法,就能实现你的功能,希望对你有帮助,

你确定你运行了嘛?
回复 使用道具 举报
一碗小米周 发表于 2013-11-1 15:38
你确定你运行了嘛?

嗯,是的
回复 使用道具 举报
  1. BigDecimal a = new BigDecimal("3.1");
  2.                 BigDecimal b = new BigDecimal("3");

  3.                 double c = 3.1;
  4.                 double d = 3;

  5.                 System.out.println("精确计算的结果是:" + (a.subtract(b)));//减法
  6.                 System.out.println("浮点型计算的结果是:" + (c - d));
复制代码
double 浮点型只是近似值,精确计算需要用到Bigdecimal这个类。
从上例中可以明显看到结果的差异。结果:
  1. 精确计算的结果是:0.1
  2. 浮点型计算的结果是:0.10000000000000009
复制代码

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
∏艾力克斯※ 发表于 2013-11-1 16:12
double 浮点型只是近似值,精确计算需要用到Bigdecimal这个类。
从上例中可以明显看到结果的差异。结果: ...

恩。谢了。那你可以看下我这段代码,为什么会报异常吗?有什么问题呢、
  1. public class MathDemo {

  2.         public static void main(String[] args) {
  3.                         getDouble(3.14);

  4.         }
  5.         public static void getDouble(double d){
  6.                 BigDecimal bid = new BigDecimal("d");
  7.                 double dd=Math.floor(d);
  8.                 BigDecimal bidd = new BigDecimal("dd");
  9.                 System.out.println(bid.subtract(bidd));
  10.        
  11.         }

  12. }
复制代码
回复 使用道具 举报
  1. public static void getDouble(double d){
  2.                 BigDecimal bid = new BigDecimal("d");
  3.                 double dd=Math.floor(d);
  4.                 BigDecimal bidd = new BigDecimal("dd");
  5.                 System.out.println(bid.subtract(bidd));
  6.         
  7.         }
复制代码
你在声明变量时,初始值给的是"d",是字符串,而不是double类型的d,所以会导致类型错误。
如果你声明时直接给变量d,也不对,这样结果也不会是预期般的精确,因为赋值时,就给了一个非精确近似值(double d),结果自然也就是非精确近似值了。
而且,只有Math.floor的参数只能为double类型,所以要改的话,就变成这样了:
  1. public class MathDemo {

  2.         public static void main(String[] args) {
  3.                 getDouble( new BigDecimal("3.14"));
  4.         }

  5.         public static void getDouble(BigDecimal d) {
  6.                 //double dd = Math.floor(d);
  7.                 BigDecimal bidd = d;
  8.                 System.out.println(d.subtract(bidd));
  9.         }

  10. }
复制代码
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马