无法解释的类型转换

adrain_sengtang 2008-07-26 09:46:44
public class Test {
public static void main(String[] args) {
double i = 23;
double j = 56.21;
double x = 3;
double y = 3.21;
System.out.println(i + j);
System.out.println(x + y);
}
}

运行结果:
79.21000000000001
6.21
...全文
90 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
sagezk 2008-07-26
  • 打赏
  • 举报
回复
楼主 Google/Baidu 一下 IEEE754
izhaohan 2008-07-26
  • 打赏
  • 举报
回复
这没有什么自动转换的问题,又不是int+double。

我前几天也遇到了double+double出现了这种问题,

是数额比较大的两个double相加,设计到钱的问题,

最后我改成了BigDecimal这个类型,问题就解决了。

好像是关于什么精度的问题。
Ailen15 2008-07-26
  • 打赏
  • 举报
回复
有本java解惑,楼主可以去看看!
zack1011 2008-07-26
  • 打赏
  • 举报
回复
首先这要牵涉到JAVA语言中DOUBLE与FLOAT的存储方式:
他们的二进制存储方式:

1.float:
SEEEEEEEEMMMMMMMMMMMMMMMMMMMMMMM

一位表示符号,8位表示指数(底数为2),用23位来表示参数

2.double:
SEEEEEEEEEEEMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM

一位表示符号,11位表示指数(底数为2),用52位来表示参数

举个例子:

float 类型的数字0.1的二进制数据形式:

float f = 0.1F;
System.out.println(Float.floatToIntBits(f));//打印1036831949

以上程序输出int类型的数据1036831949,它对应的32位二进制数据形式:
0 01111011 10011001100110011001101

所以符号位S是0,指数部分E为01111011,对应无符号整数123,尾数部分的隐含为是1,因此实际的尾数是1.10011001100110011001101

以上二进制数据流对应的二进制数学运算表达式为:
(-1)^0*2^(123-127)*1.10011001100110011001101
即:
110011001100110011001101*2^-27
表达式对应的十进制数据表达式:
13421773*2^-27

所以,表达式的值为:
0.100000001490116119384765625

可见,在内存中,32 为的二进制数科学计数法不能准确地表示0.1。他的误差为0.000000001490116119384765625

double 采用64位精度要高,误差为:0.00000000000001

xuhaiyang 2008-07-26
  • 打赏
  • 举报
回复
double输出要format一下的,不然问题很大
CpRcF 2008-07-26
  • 打赏
  • 举报
回复
因为 二进制 无法精确表示 浮点数
xujiaxiang 2008-07-26
  • 打赏
  • 举报
回复
79.21000000000001
这个不知道它怎么算来的,无法解释
adrain_sengtang 2008-07-26
  • 打赏
  • 举报
回复
各位 不明白就不要乱说
以上代码都是 double类型的, 也是运行结果不 对,不是类型转换的原因
何止java是这样的呢;其他语言也是 不能精确计算小数的

adrain_sengtang 2008-07-26
  • 打赏
  • 举报
回复
谢谢 各位
adrain_sengtang 2008-07-26
  • 打赏
  • 举报
回复
public class Test {
public static void main(String[] args) {
double i = 23.0;
double j = 56.21;
double x = 3.0;
double y = 3.21;
System.out.println(i + j);
System.out.println(x + y);
}
}
运行结果:79.21000000000001
6.21
zidasine 2008-07-26
  • 打赏
  • 举报
回复
int----->double是自动转换的
milo-higgs 2008-07-26
  • 打赏
  • 举报
回复
这个不是无法解释,这是java的默认的情况,java的double型的计算,天生就是不精确的。
  • 打赏
  • 举报
回复
double啊

无法解释?

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧