黑马程序员技术交流社区

标题: 关于Math类的一个简单小问题。求解。 [打印本页]

作者: 一碗小米周    时间: 2013-11-1 14:35
标题: 关于Math类的一个简单小问题。求解。
本帖最后由 一碗小米周 于 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吗?谢谢。

作者: 杨增坤    时间: 2013-11-1 14:59
  1. public static double getDouble(double d){
  2.             
  3.             return d-(int)d;
  4.             
  5.     }
复制代码
也许是精度的问题
使用这个方法,就能实现你的功能,希望对你有帮助,


作者: 一碗小米周    时间: 2013-11-1 15:38
杨增坤 发表于 2013-11-1 14:59
也许是精度的问题
使用这个方法,就能实现你的功能,希望对你有帮助,

你确定你运行了嘛?
作者: 杨增坤    时间: 2013-11-1 15:51
一碗小米周 发表于 2013-11-1 15:38
你确定你运行了嘛?

嗯,是的
作者: ∏艾力克斯※    时间: 2013-11-1 16:12
  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
复制代码

作者: 一碗小米周    时间: 2013-11-1 19:50
∏艾力克斯※ 发表于 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. }
复制代码

作者: ∏艾力克斯※    时间: 2013-11-2 10:00
  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. }
复制代码





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