黑马程序员技术交流社区

标题: String转double的问题 [打印本页]

作者: 杨明宁    时间: 2012-10-19 17:15
标题: String转double的问题
本帖最后由 杨明宁 于 2012-10-23 19:39 编辑

1、String str = "199.45"
  Double.parseDouble( str );
  结果不是199.45,而是199.4499999999999990
2、a=19 , b=99.63;
  c = a*b
  结果不是1892.97,而是1892.96999999999998

这是怎么回事呢?
作者: 刘伟平    时间: 2012-10-19 17:23
输入字符串的数值被直接转换为目标浮点类型。分两步的转换(先将字符串转换为 float,然后将 float 转换为 double)不 同于直接将字符串转换为 double。例如,float 字面值 0.1f 等于 double 值 0.10000000149011612;float 字面值 0.1f 表示与 double 字面值 0.1 不同的数值。(数值 0.1 无法用二进制浮点数准确表示。)

所以这个方法得到的是某种算法计算出的数值,而不是简单字面上的数值。
所以要手动限定小数位数。
作者: 杨卫腾    时间: 2012-10-19 17:28
LZ 这个是因为 你是从字符串转换成了double类型的呀
double类型的数是双精度的64位的,所以显示的那么长的数。

2、a=19 , b=99.63;
  c = a*b
  结果不是1892.97,而是1892.96999999999998

这个原因是 b 是float类型的,c = a * b;
c也是浮点型的,不加说明的浮点型(float)数默认是double类型的。
所以c是那么长的数。
作者: 孙含庆    时间: 2012-10-19 17:48
本帖最后由 孙含庆 于 2012-10-19 17:49 编辑

import java.math.BigDecimal;

class Test
{
        public static void main(String[] args)
        {

                //double 和 float 类型的数据进行运算时,会出现结果不准的情况
                //你可以试试这个
                System.out.println(0.05+0.01);

                //这个打印结果是 0.060000000000000005,他就是不出 0.06

                //计算机二进制不能准确表示十进制浮点数,也算是二进制的蹩脚之处
                //当然,上面这种情况可以避免
                        
                          
                //导入Math包中的BigDecimal 专门用于解决这种问题
                          double a = 19,b = 99.63;
                                
                               //把这两个数封装成BigDecimal 对象
                          BigDecimal double1 = new BigDecimal(Double.toString(a));
                          BigDecimal double2 = new BigDecimal(Double.toString(b));

                          System.out.println(a+"*"+b+"="+double1.multiply(double2));

                          //BigDecimal 的 multiply 方法就是算出这两个数字的乘积

                          //你可以查看api 文档中的 BigDecimal 类,来了解他的用法

        }
}

作者: 陈虹旭    时间: 2012-10-19 21:14
楼主用包装类对象接收下 然后再输出试下:
  1. import java.util.*;
  2. class Test1
  3. {
  4.         public static void main(String[] args)
  5.         {
  6.                 String s = "199.45";

  7.                 Double d =Double.parseDouble(s);

  8.                 System.out.println(d);
  9.         }
  10. }
复制代码





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