C# 中double数据类型,相加减丢失精度问题?

zhouge_IT 2008-11-03 03:29:51
double a = 12.372;
double b = 13.378;
double c = b - a;
MessageBox.Show(c.ToString());
这里的显示结果是:1.006
如果把 b改为12.378,即:double b = 12.378;
结果不是:0.006
那位大侠能说说原因呢?
...全文
1973 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
gogogo 2008-11-04
  • 打赏
  • 举报
回复 1
float 内存如何存储的

类型 存储位数 总位数 偏移值
(offset)
数符(S) 阶码(E) 尾数(M)
短实数(float) 1 8 23 32 127
长实数(double) 1 11 52 64 1023


N (10) = 123.456,

换算成二进制表示:

N (2) = 1111011. 01110100101111001

= 1. 11101101110100101111001(...) * 2^6

那么E – 127 = 6; E = 127 + 6 = 133(10) = 10000101(2)

M = 111 0110 1110 1001 0111 1001 (省略了最高数字位1, 共23bit)

组合起来就是:

S E M

0 10000101 111 0110 1110 1001 0111 1001

4bit一间隔:

0100 0010 1111 0110 1110 1001 0111 1001

4 2 F 6 E 9 7 9

gogogo 2008-11-04
  • 打赏
  • 举报
回复
根本原因很简单,你去查了float ,double类型在内存中的标识方法就明白了
zhouge_IT 2008-11-04
  • 打赏
  • 举报
回复
谁能够说说其根本原因?
enihs 2008-11-03
  • 打赏
  • 举报
回复
mark
onedream 2008-11-03
  • 打赏
  • 举报
回复
使用科学计数法表示,
如果你想使用更高的精度,可以使用decimal
onedream 2008-11-03
  • 打赏
  • 举报
回复
double是浮点数
dlmeijianyu 2008-11-03
  • 打赏
  • 举报
回复
我的结果和lz一样。
是不是由于精度问题造成的。
zhouge_IT 2008-11-03
  • 打赏
  • 举报
回复
补充 修改后,c的值为:0.00600000000000023

110,537

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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