double型数据的强制转换问题
1个回答
展开全部
分类: 电脑/网络 >> 程序设计 >> 其他编程语言
问题描述:
c++中,我写了这样几句:double a=8888.88;a=(int)(a*100);cout<<a;
我以为结果会是8888.88,而事实却是888887,改成a=(long)(a*100)也是一样的,这是为什么呢?
解析:
二楼的没把关键问题说到,问题也不是在于低精度数据类型向高精度数据类型的转换时的精度丢失。
1.因为double型用于表示有效数值的位数是有限的,所以对于许多十进制小数,它们转换为相应的二进制小数时,要求非常之多甚至是无限的位数(与十进制里的无穷小数类似),对于这些十进制小数double在表示时只能采取一定位数的近者枝饥似。这个就是浮点数的近似表示,问题关键是这一层次上的精度首返缺失。
8888.88就是这样一个数。也就是说计算机中保存的值类似于8888.87999...9(强调,类似。精确地写出来很麻烦搭芦)。
2、a*100结果为 888887.999...9
转换时,将小数点后的数全部截去得888887
3、大多数都会出现这样的问题,但不是所有的,比如7777.75相同的运算就应该还是777775。
4、参见:十进制与二进制数之间的转换。
float/double型数据的硬件实现。
问题描述:
c++中,我写了这样几句:double a=8888.88;a=(int)(a*100);cout<<a;
我以为结果会是8888.88,而事实却是888887,改成a=(long)(a*100)也是一样的,这是为什么呢?
解析:
二楼的没把关键问题说到,问题也不是在于低精度数据类型向高精度数据类型的转换时的精度丢失。
1.因为double型用于表示有效数值的位数是有限的,所以对于许多十进制小数,它们转换为相应的二进制小数时,要求非常之多甚至是无限的位数(与十进制里的无穷小数类似),对于这些十进制小数double在表示时只能采取一定位数的近者枝饥似。这个就是浮点数的近似表示,问题关键是这一层次上的精度首返缺失。
8888.88就是这样一个数。也就是说计算机中保存的值类似于8888.87999...9(强调,类似。精确地写出来很麻烦搭芦)。
2、a*100结果为 888887.999...9
转换时,将小数点后的数全部截去得888887
3、大多数都会出现这样的问题,但不是所有的,比如7777.75相同的运算就应该还是777775。
4、参见:十进制与二进制数之间的转换。
float/double型数据的硬件实现。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
光点科技
2023-08-15 广告
2023-08-15 广告
通常情况下,我们会按照结构模型把系统产生的数据分为三种类型:结构化数据、半结构化数据和非结构化数据。结构化数据,即行数据,是存储在数据库里,可以用二维表结构来逻辑表达实现的数据。最常见的就是数字数据和文本数据,它们可以某种标准格式存在于文件...
点击进入详情页
本回答由光点科技提供
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询