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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 杨明宁 中级黑马   /  2012-10-19 17:15  /  1784 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 杨明宁 于 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

这是怎么回事呢?

评分

参与人数 1技术分 +1 收起 理由
韩军博 + 1 很给力!

查看全部评分

4 个回复

正序浏览
楼主用包装类对象接收下 然后再输出试下:
  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. }
复制代码
回复 使用道具 举报
本帖最后由 孙含庆 于 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 类,来了解他的用法

        }
}

评分

参与人数 1技术分 +1 收起 理由
韩军博 + 1 很给力!

查看全部评分

回复 使用道具 举报
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是那么长的数。
回复 使用道具 举报
输入字符串的数值被直接转换为目标浮点类型。分两步的转换(先将字符串转换为 float,然后将 float 转换为 double)不 同于直接将字符串转换为 double。例如,float 字面值 0.1f 等于 double 值 0.10000000149011612;float 字面值 0.1f 表示与 double 字面值 0.1 不同的数值。(数值 0.1 无法用二进制浮点数准确表示。)

所以这个方法得到的是某种算法计算出的数值,而不是简单字面上的数值。
所以要手动限定小数位数。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马