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型数据的硬件实现。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询