十进制的0.1 为什么不能用二进制很好的表示?

二进制表示法。。。。

这是也是基础知识啦:

别急我们一点一点的讲解。正整数转二进制,负整数转二进制,小数转二进制



正整数转二进制:  正整数转成二进制。要点一定一定要记住哈:除二取余,然后倒序排列,高位补零。

21 /2    -------------------------------余  1

10/2     -------------------------------余   0

5/2      ------------------------------- 余   1

2/2      --------------------------------余  0

1/2     ---------------------------------余 1

记住,到着排序  10101  ,验证下转成十进制: 1×2的4次方+1×2的2次方+1×2的0次方=16+4+1=21。正确。

计算机一般是8 位 16位  32位  64 位的,所以不够位高位补零。8位表示法:00010101



负整数转二进制:先是将对应的正整数转换成二进制后,对二进制取反,然后对结果再加一。

取 -21 演示,看口诀,

21 的二进制表示为: 10101

取反:  01010

加一 : 01011



小数转换为二进制的方法:对小数点以后的数乘以2,有一个结果吧,取结果的整数部分(不是1就是0喽),然后再用小数部分再乘以2,再取结果的整数部分……以此类推,直到小数部分为0或者位数已经够了就OK了。

演示: 0.125 ×2=0.25 .......................0

0.25×2=0.5.............................0

0.5×2=1.0................................1

即 0.125的二进制表示为小数部分为0.001

记住,乘到小数为0。排序:正序。

验证: 0.001        0×2的0次方+0×2的-1次方+0×2的-2次方+0×2的-3次方=1/8=0.125.正确。

现在来说明0.1转二进制不能表示的原因啦:

0.1×2=0.2 .....................0

0.2×2=0.4 ......................0

0.4×2=0.8 .....................0

0.8×2=1.6.......................1

0.6×2=1.2.......................1

0.2×2=0.4.......................0

.....

是无限循环的。所以。。。。你懂的!




for(double i=0;i!=10;i+=0.1)
{
}

有可能是死循环。用浮点数循环需要注意啦。

时间: 2024-11-06 03:51:20

十进制的0.1 为什么不能用二进制很好的表示?的相关文章

笔试算法题(33):烙饼排序问题 & N!阶乘十进制末尾0的个数二进制最低1的位置

出题:不同大小烙饼的排序问题:对于N块大小不一的烙饼,上下累在一起,由于一只手托着所有的饼,所以仅有一只手可以翻转饼(假设手足够大可以翻转任意块数的 饼),规定所有的大饼都出现在小饼的下面则说明已经排序,则最少需要翻转几次,才能达到大小有序的结果(改变饼的顺序只能整体翻转,不能相邻交换): 分析: 假设饼大小编号为1,--,N,1就是最小的饼,N就是最大的饼,最大的N饼翻转到最下面之前,一定需要达到最上面,所以首先需要寻找N饼所在的位置,翻 转到最上面,然后翻转所有的饼,这样N饼就可以就位: 然

(转)从Python的0.1输出0.1000000000000001说浮点数的二进制

原文地址:http://blog.csdn.net/u012843100/article/details/60885763 今天在学习Python核心编程的时候,十进制浮点数那段看到一个有趣的事情. >>>0.1 0.1000000000000001 为什么会这样?文中是这样解释的: 这是因为语言绝大多数C语言的双精度实现都遵守IEEE754规范,其中52位用于底.因此浮点值只能有52位精度,类似这样的值用二进制表示只能像上面那样被截断.0.1的二进制表示是0.1100110011001

8086汇编——作业总结1——ASCII码0~9转为8位二进制输出

思路: 将ASCII码转为数字->将数字的8位二进制一位一位转为ASCII输出 MOV AH,01H INT 21H  ;输入的ASCII存入AL ASCII码转为数字:SUB AL,30H 数字一位一位转为ASCII码:(加个循环) MOV DL,0 SAL AL,1 ;高位先输出,算数左移,高位移进CF ADC DL,30H ;全加,加CF位,结果‘0’或‘1’,即30H或31H,存入DL ;ASCII码7位 MOV AH,02H :输出的值存入DX INT 21H

Python——简单实现十进制对十六、八、二进制的转换

#coding:utf-8 '''     最近在看数据结构----Stack     这也是来自国外大神写的一个" 教学 " 十进制数字转换成----十六.八.二进制 ''' # 通过面向对象class了一个Stack class Stack:     def __init__(self):         self.items = [] def isEmpty(self):         return self.items == [] def push(self, item):

MySQL8.0.11 for linux7.2 二进制安装

MySQL8.0安装官方文档: https://dev.mysql.com/doc/refman/8.0/en/binary-installation.html 安装前注意: MySQL8.0和MySQL5.7和之前的版本还是有区别的,第一点就是在安装MySQL的时候 密码认证方式:默认的密码加密方式是:caching_sha2_password,而现在很多客户端工具还不支持这种加密认证方式,可以在配置文件中加入:default_authentication_plugin=mysql_nativ

N的阶乘末尾0的个数和其二进制表示中最后位1的位置

问题一解法: 我们知道求N的阶乘结果末尾0的个数也就是说我们在从1做到N的乘法的时候里面产生了多少个10, 我们可以这样分解,也就是将从0到N的数分解成因式,再将这些因式相乘,那么里面有多少个10呢? 其实我们只要算里面有多少个5就可以了? 因为在这些分解后的因子中,能产生10的可只有5和2相乘了,由于2的个数是大于5的个数的,因此 我们只要算5的个数就可以了.那么这个题目就是算这些从1到N的数字分解成因子后,这些因子里面 5的个数. Python代码 def factorialnumberof

[ActionScript 3.0] AS向php发送二进制数据方法之——在URLRequest中构造HTTP协议发送数据

主类 HTTPSendPHP.as 1 package 2 { 3 import com.JPEGEncoder.JPGEncoder; 4 import com.fylib.httpRequest.HttpRequestBuilder; 5 import com.fylib.httpRequest.HttpRequestBuilderConsts; 6 import flash.display.Bitmap; 7 import flash.display.BitmapData; 8 impor

2、Python基础--除法、常用数学函数

整数与整数相除: >>> 2/5 0 >>> 2.0/5 0.4 >>> 2/5.0 0.4 >>> 2.0/5.0 0.4 >>> 7/2 3 >>> 7.0/2 3.5 >>> 注意:整数除以整数,结果是整数(取商): 例如7/2,商是3(整数),余数是2,结果值为3. 浮点数与整数相除: >>> 9.0/2 4.5 >>> 9/2.0 4.

2 除法啰嗦,不仅是python。

整数除以整数 进入python交互模式之后(以后在本教程中,可能不再重复这类的叙述,只要看到>>>,就说明是在交互模式下),练习下面的运算: >>> 2 / 5 0 >>> 2.0 / 5 0.4 >>> 2 / 5.0 0.4 >>> 2.0 / 5.0 0.4 看到没有?麻烦出来了(这是在python2.x中),按照数学运算,以上四个运算结果都应该是0.4.但我们看到的后三个符合,第一个居然结果是0.why? 因