黑马程序员技术交流社区
标题:
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
楼主用包装类对象接收下 然后再输出试下:
import java.util.*;
class Test1
{
public static void main(String[] args)
{
String s = "199.45";
Double d =Double.parseDouble(s);
System.out.println(d);
}
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2