请教一个double与long型数据转换的问题,问题出在哪里?

dalinsky 2004-06-21 05:51:00
代码段一:
char* str="9.20";
double d=atof(str);
d=d*100;
long a=d;

代码段二:
double a1=920.00000000000;
long a=a1;


结果代码段一的a值是919,代码段二的a值是920,问题出在哪里?(在VC6.0下编译)
...全文
388 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
laker_tmj 2004-06-24
  • 打赏
  • 举报
回复
up learn
yifanlxj 2004-06-24
  • 打赏
  • 举报
回复
好,我在看
狂放之歌 2004-06-24
  • 打赏
  • 举报
回复
he_zhidan(何志丹:风云伐日) ( )

志 丹分析 好深入 慢慢看,不懂大家就骚扰他。呵呵
  • 打赏
  • 举报
回复
920
的二进制数量级是9
只要二进制的有效数字小数点后面9位有误差
误差就为1

1.99999999999 * 10E9
小数后面n位有误差转换成整数就看的出来
  • 打赏
  • 举报
回复
float的存储形式参考一下

00000000 00000000 001000 00100000 0
------- ------- ------ --------
8位 8位 7位
-----------------------
有效部分,右边是高位,所以是1/8
有效值为1+1*(八分之一) = 1.25


符号位1bit
指数部分exp, 8bit 范围[0,255]
有次数部分value,23bit,范围[0,max],max的值是23位全部是1
为正:
[ 1 + 1 * ((float)value/max)] * 2^(exp - 127)


0x00 0x00 0x80 0x3f
倒置
0x3f800000


0 01111111 0000000 00000000 00000000
--- ------- -------------------------
符号 指数127 有效部分0

结果为 (1+ 1 * 0) * 2的(127-127)次方 = 1

0x00 0x00 0x20 0x40
倒置
0x40 0x20 0x00 0x00
0 10000000 0100000 00000000 00000000
----- -------- -------------------------
1bit 8bit 23bit,最大值为1/4

故为 (1+1*(1.0/4)) * 2的(128 -127)次方 = 1.25 * 2 = 2.5

include <stdio.h>
#include <math.h>
#include <memory.h>

int main()
{
int int_1 = 2;
float float_2 = 2.5;
char temp[5]="0000";
memcpy(temp,&float_2,4);
/* printf("%f, %d\r\n", int_1, float_2);
printf("%f", pow(2, 30)+ pow(2, 21));

scanf("%d",int_1);*/
return 0;
}

---------------------------
技术上可行
符合你的要求吗?
如果不明白
请给我发短消息
请附: 帖子的地址
或在
http://www.338888.com/VCShare/Default.asp
上提问
  • 打赏
  • 举报
回复

double 的存储形式
1bit 符号 11 bit 指数(2进制) 52bit有效值部分
920.0000 直接转换成2进制的科学记数法
9.2 * 100
9.2和100被分别拆成科学记数法,再计算,共产生了三次误差
wangweintk 2004-06-22
  • 打赏
  • 举报
回复
期待解答,帮你up一下。
wangweintk 2004-06-22
  • 打赏
  • 举报
回复
long a = d / 0.99999999;
hopen 2004-06-21
  • 打赏
  • 举报
回复
不行的话加0.5吧
dalinsky 2004-06-21
  • 打赏
  • 举报
回复
俺也知道是精度问题,可是怎么解决呢?
flyelf 2004-06-21
  • 打赏
  • 举报
回复
精度问题
Kudeet 2004-06-21
  • 打赏
  • 举报
回复
http://community.csdn.net/Expert/topic/3101/3101122.xml?temp=.1809961

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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