为什么会有0.1+0.2不等于0.3的问题
c语言
出现这个情况的根本原因是因为计算机是二进制文件处理数据,我们知道数学数据类型有有理数、无理数、虚数。计算机只能处理二进制。所以对于无理数、分数、有限循环小数计算机是没办法进行二进制表示的。即使是有理数,计算机也很难用二进制全部表示。例如有理数,小数0.1。
十进制小数转成二进制小数的原理:
十进制小数转换成二进制小数采用"乘2取整,顺序排列"法。具体做法是:用2乘十进制小数,可以得到积,将积的整数部分取出,再用2乘余下的小数 部分,又得到一个积,再将积的整数部分取出,如此进行,直到积中的小数部分为零,或者达到所要求的精度为止。
然后把取出的整数部分按顺序排列起来,先取的整数作为二进制小数的高位有效位,后取的整数作为低位有效位。
按照上述规则:对0.1进行二进制表示0.0001100110011...。0011会无限循环下去。你看计算机存储数据弱爆了。连个0.1都表达不了。这样就导致其进行数据计算时,存在精度丢失的情况。也就是我们常见的0.1+0.20.3。
十进制整数转换成二进制
十进制整数转换为二进制整数采用"除2取余,逆序排列"法。具体做法是:用2去除十进制整数,可以得到一个商和余数;再用2去除商,又会得到一个商和余数,如此进行,直到商为零时为止,然后把先得到的余数作为二进制数的低位有效位,后得到的余数作为二进制数的高位有效位,依次排列起来。即运算结果逆序排序
拓展:10.1 的二进制表示
整数部分按照整数部分二进制表示,小数部分按照小数规则表示,然后把整数部分和小数部分合并起来。
10.1的二进制表示为1010.0001100110011....。
本参: 别介意,看过。略过,知道就行了。哈哈
wzx18373330053: 这几张图,,,,见过好几个不同的网站了,全是一样的图,包括红字,内容都是一样的,有18年的,有20年的,你这21年的还是这个,,,抄都抄这么晚
本参: 项目打包的类型,可以使jar、war、rar、ear、pom,默认是jar
不正经的kimol君: 谢谢分享,很有用
编程界小明哥: 写的很棒学到了,欢迎来我博客指点江山