写个微信小程序parsefloat验证一下,float浮点型能不能表示0.1999999

doule 型 和float 型表示的0都不是0
阅读下面程序
#include&stdio.h&
int main(){
for(i = 0;i != 10;i+=0.1){
printf("%.1f\n",i);
试运行,看看结果是不是和你想的一样。
#include&stdio.h&
int main()
float f = 1.0;
float f1 = f/3;
// f1 = 1/3
float f2 = f1*3;
float f_result = f1 - f2/3;
//f_result = 0 ???
if(0.0f == f_result)
printf("f_result== 0/n");
printf("f_result!= 0/n");
通过上述程序,可以明确得到答案,但具体为什么如此,还需要从C语言中float类型变量的编码格式说起。
浮点数表示形如V=x * 2^y
的有理数进行编码,IEEE标准754仔细制定了浮点数及其运算的标准。
十进制的12.34可以这样表示:1*10^1 + 2*10^0 + 3*10^-1 + 4*10^-2。同样地,二进制的101.11可以这样表示:1*2^2
+ 1*2^0 + 1*2^-1 +1*2^-2 。注意而今之中形如0.111…1正好是小于1的数。假定只用有限长度的编码,那么十进制是不能准确表示想1/3、5/7这样的数的,类似的,小数的二进制表示法只能表示那些能够被写成x
* 2^y的数,其他的只能用近似数来表示。
IEEE浮点标准用V=(-1)^s * M * 2^E的形式来表示一个数:
(1)符号(sign)s决定数是负数(s=1)还是正数(s=0),而对0的符号位作为特殊情况处理。
(2)有效数(significant)M是一个二进制小数。
(3)指数(exponent)E是2的幂(可能是负数),他的作用是对浮点数的加权。
一个浮点数的位表示按上述情形划分为3个域。
标准C语言中,单精度float浮点格式的符号位=1,有效位=23,指数未=8,产生一个32位的表示。双精度double浮点格式的符号位=1,有效位=52,指数位=11,产生一个64位的表示。
根据指数位的值,被编码的值可以分为三种不同的情况,即,规格化值、非规格化值、特殊数值。当指数的为不全为0且不全为1时,属于规格化值;当指数位全为0时,属于非规格化值;当指数位全为1时,属于特殊数值。下面主要了解一下后两者情况。
非规格化值有两个目的。首先提供了一种表示数值0的方法当小数位也全为0时,可以根据符号位的不同表示+0.0和-0.0。另外一个功能是用来表示那些非常接近0.0的数,使用逐渐下溢出(gradual
underflow)的方法实现这个属性。特殊数值当指数位全为1,而小数位全为0时,可以表示正无穷大和负无穷大。当小数位为非零时,结果值被称为NaN。
因为表示方法限制了浮点数的范围和精度,所以浮点运算只能近似地表示实数运算。系统需要使用“最接近”匹配值的值保存浮点值,这就是舍入(rounding)运算的任务。IEEE规定了四种舍入方式,默认的方式是向偶数舍入,也叫向最接近的值舍入。
浮点数的表示是不精确的,不能直接比较两个数是否完全相等,一般都是在允许的某个范围内认为像个浮点数相等,如有两个浮点数a,b,允许的误差范围为1e-6,则abs(a-b)&=1e-6,即可认为a和b相等。还有一种方法就是扩大再取整,比如a=5.23,b=5.23,直接比较 a==b一般为false,但是a和b都扩大一百倍,然后强制转换为int类型,再用==比较就可以了
float型变量和“零值”比较的方法:
const float EPSINON = 0.000001;
if ((x &= - EPSINON) && (x &=EPSINON))
浮点型变量并不精确,其中EPSINON是允许的误差(即精度),所以不可将float变量用“==”或“!=”与数字比较,应该设法转化成“&=”或“&=”形式。如果写成if (x == 0.0),则是错误的。
因为1.0在计算机中可能存为0..00001等,很难恰好是1.0
没有更多推荐了,【数学】1大还是0.~大-学路网-学习路上 有我相伴
1大还是0.~大
来源:互联网 &责任编辑:王小亮 &
1大还是0.9999.....大一样大设x=0.9999....则x*10=9.9999....即9=9x所以x=1.数学里1大还是0.9999(无限循环)大为什么1/3等于0.999(无...0.9999(无限循环)=10.3333...=1/3等式左右两边同时乘以3可以得到1和0.9999。。相等1和0.9999999循环小数,是1大,还是0.9999大,还是等于?&是等于,这个可以证明的例如1/3=0.33333....两边都乘以3,就得1=0.9999...1和0.9999999循环小数,是1大,还是0.9999大,还是等于?是等于,这个可以证明的例如1/3=0.33333.两边都乘以3,就得1=0.9999...1大还是0.9999……大没有误区,这完全是正确的,用极限就可以求得1大还是0.~大(图3)1大还是0.~大(图5)1大还是0.~大(图7)1大还是0.~大(图9)1大还是0.~大(图12)1大还是0.~大(图15)这是用户提出的一个数学问题,具体问题为:1大还是0.~大我们通过互联网以及本网用户共同努力为此问题提供了相关答案,以便碰到此类问题的同学参考学习,请注意,我们不能保证答案的准确性,仅供参考,具体如下:1大还是0.9999……大没有误区,这完全是正确的,用极限就可以求得防抓取,学路网提供内容。用户都认为优质的答案:0.9999无限循环大还是1大?1大0.9999无限循环只是无限接近1,但还不到1防抓取,学路网提供内容。运用构造法 把0.…9×10,得9.…9 0.9999.......比1大还是小设X=0.9999.......则10X=9.9999.......,相减得9X=9,X=1即0.9999.......=1防抓取,学路网提供内容。9.…9-0.…9=9(小数部分抵消) 0.1大还是0.09怎么比较问:0.1大还是0.09怎么比较答:单纯的数字吗?防抓取,学路网提供内容。9.…9-0.…9又=0.…9×10-0.…9×1=0.…9×9 是0大还是1大?答:当然是1大防抓取,学路网提供内容。那么0.…9×9=9 0.28大还是0.1大?问:0.28大还是0.1大?答:0.28&0.1防抓取,学路网提供内容。等式两边都÷9 负0.1大还是负0.2大答:负0.1>负0.2负数的绝对值越大就越校防抓取,学路网提供内容。得1=0.…9(不是四舍五入 ) 怎么0.1大还是0.01大问:怎么0.1大还是0.01大答:0.1和0.01相比;0.1大;0.1-0.01=0.09防抓取,学路网提供内容。(这似乎令人不相信,但却是正确的) -0.5大还是1大?答:当然是1大…因为1是正数,任何正数都比负数大!防抓取,学路网提供内容。也可以用方程做,方法如下:1.00是大于是小于还是等于1.0问:1.00是大于是小于还是等于1.0答:1.00是大于是小于还是等于1.01.00和1.0都是近似值,无法比较大小.请采纳,谢谢.防抓取,学路网提供内容。设0....9=X 比1比0.2大还是0.5大问:比1比0.2大还是0.5大答:解:1比0.2大1比0.5大0.2比0.5小1>0.5>0.2防抓取,学路网提供内容。10*X=9+0....9=9+X 比较大小1.018大还是1.18大答:1.18大于1.018防抓取,学路网提供内容。解方程得X=1,所以,0....9=1 1/3和0.3的无限循环哪个大,还是一样大答:1/3=10/300.3=3/10=9/30所以1/3大于0.3防抓取,学路网提供内容。另外,我介绍一下纯循环小数化成分数的方法:防抓取,学路网提供内容。循环节有几位,分母就连写几个9;分子是循环节.一杯黄芪水,给身体带来6个意想不到的强大变化!黄芪的药用迄今已有2000多年的历史,早在神农本草经中记载,黄芪被录为上品,“主痈疽久败创,排脓止痛,大风,痢疾,五痔,鼠瘘,补虚,小儿百病。”其有增强机防抓取,学路网提供内容。按照这种方法,也可以说明1=0.…9.送砩吓憷细盖鬃≡海旌米≡菏中阶≡翰》浚灰揭换ち淖盘炀涂醋盼颐羌绦奶欤胰侠细盖鬃蒙锨拔恃≡菏乱耍饬饺颂劝谅梦曳⒒穑饺死砜髯爨倭车踝虐旌萌朐菏中笠缴蛊孑獾亩晕腋缢担院蟛环雷ト。吠峁┠谌荨0.9999无限循环大还是1大?1大0.9999无限循环只是无限接近1,但还不到10.9999.......比1大还是小设X=0.9999.......则10X=9.9999.......,相减得9X=9,X=1即0.9999.......=10.1大还是0.09怎么比较问:0.1大还是0.09怎么比较答:单纯的数字吗?是0大还是1大?答:当然是1大
相关信息:
- Copyright & 2017 www.xue63.com All Rights Reserved在 SegmentFault,学习技能、解决问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。
问题对人有帮助,内容完整,我也想知道答案
问题没有实际价值,缺少关键内容,没有改进余地
惊闻 0.1 + 0.2 !== 0.3,赶忙计算得验证,发现,0.1 加 0.2 等于 0.000040.1 + 0.2 == 0.00004 返回 True谁能给我解释下为什么,javascript这是要闹哪样啊。。。
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
注:下面为早期学习记录未注明原作者,找到时补上。JavaScript的number类型按照ECMA的JavaScript标准,它的Number类型就是IEEE 754的双精度数值,相当于java的double类型。IEEE 754标准《二进制浮点数算法》(www.ieee.org)就是一个对实数进行计算机编码的标准。因此精度问题不止JS这门语言独有。无论是用纸张记录数值,还是用计算机记录数值,都必须用某种编码方案来表达数值。必须理解的是,用编码表达的数值不是数值本身,而只是数值的一种人类或计算机可理解的描述。任何编码方案都有其局限,要么是表达范围(精度)方面的限制,要么是其他复杂性方面的制约。绝对完美的数值编码方案是不存在的,为了处理方便,这个标准引入了大量的折衷和妥协,建立在这种表达方式上的算法(例如除法运算)也一样。由于数值表达方式存在“缺陷”,运算结果不可避免地堆聚起越来越多的误差。按IEEE 754格式保存的浮点数精度相当于带有15、16或17位小数位数的十进制小数,由于存在二进制和十进制的转换问题,具体的位数会发生变化。要获得最高的转换精度,必须指定17位的小数——此时可以相信前15位的精度。在JavaScript中输出下面这些数值(注意不能作为字符串输出):0.0001(28位小数)、0.001(27位小数)、0.0456(28位小数)、0.(23位小数),显示出来的结果都是数值0.1。又如,如果输出1/3的有理数表达式,结果是0.3333。因此JavaScript小数在做四则运算时,精度会丢失。
当然也有一些方法可以来保证一定的精度:
也有人总结了一些原则:原则■ 大多数Web页面不需要小数
避免使用小数,尽量设法使用整数。确保数组的索引都是整数。按分(而不是元)计算金额。百分比放大100倍计算以避免出现小数。尽可能不用除法(/)和模(%)运算,因为大多数情况下它们直接导致出现浮点数。如果必须使用除法,立即用Math.round方法回归整数运算。■ 如果必须使用浮点数,则尽可能引入冗余小数位——即在程序要求的运算精度之外,再增加小数位
如果程序需要5位数字的小数精度,则在运算中至少保留6位的小数,8位更好。冗余位越多,累计误差的影响越小。■ 避免在同一个表达式中使用相差太大或太小的数值
对两个非常接近的数值执行减法或比较操作很容易出错。将很小的数值和很大数值相加无异于浪费时间,小的数值很可能被当作0。不过,很小的数值乘以很大的数值一般不会出现问题,例如2 * 会得到正确的结果。但是,0.1 - 0.09的结果是0.000009。■ 用isFinite()和isNaN()检查运算结果
通过表单提交任何数值运算结果之前,一定要先检查数据的合法性。■ 慎用数值运算
程序涉及的数值运算越少,引入误差的可能就越小。视浮点数为贵客,不可任意驱使。
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
浮点数都是这样的, 因为你的0.1是会变成二进制的原理可以参考
虽然是python的文档, 但是各个语言的浮点数大概都是这个意思
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
因为计算机是二进制来表示浮点数的,无法准确表示一个浮点数,只能逼近。所以0.1+0.2并不是精确的等于0.3,不仅禁是javascript这样,这不是语言的问题。
你要判断两个浮点数是否相等,还是建议用逼近的比较,比如if(fabs(a-b) & 1E-10)
//we think a is equals to b.
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
话说当你知道计算机只认识0和1时,你就应该知道0.1在计算机里面是不可能精确保存的的。
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
我有个疑问就是为什么除了0.1+0.2===0.3 为false外,其他的都是true呢
如0.4+0.2===0.6等等
该答案已被忽略,原因:无意义的内容:赞、顶、同问等毫无意义的内容,不符合答题规范:内容不是答案,可用评论、投票替代
同步到新浪微博
分享到微博?
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)
我要该,理由是:
在 SegmentFault,学习技能、解决问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。【王道论坛】2011年计算机统考真题+解析_图文_百度文库
您的浏览器Javascript被禁用,需开启后体验完整功能,
享专业文档下载特权
&赠共享文档下载特权
&10W篇文档免费专享
&每天抽奖多种福利
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
【王道论坛】2011年计算机统考真题+解析
阅读已结束,下载本文需要
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,同时保存到云知识,更方便管理
加入VIP
还剩11页未读,
定制HR最喜欢的简历
你可能喜欢C++中 如何判断一个浮点数是否为0_百度知道
C++中 如何判断一个浮点数是否为0
我有更好的答案
if(a-0.0&1e-6)else 原来和楼上说的一样。
采纳率:41%
float f=0.000bool bl=f&-0.000001&&f&0.000001;大概就是这样。
判断这个实数的绝对值是否小于一个很小的实数,比如绝对值小于1e-6
if(a==0)//...题主所问,以上。if(a&1e-6)根本就不是用来比较a是否等于0的,而是用来比较a是否约等于0。当a=1e-7时,条件依旧成立,此时a为0?我不知道是谁把问题曲解成了这样,误导别人。1.0==1.0肯定是真的,这个东西的用处在于比如循环a从0开始加0.1255,何时a==1?因为a在相加过程中不会严格意义上等于1,所以需要一个误差范围,在这个范围内时认为a约等于1。
1条折叠回答
为您推荐:
其他类似问题
浮点数的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。

我要回帖

更多关于 float 浮点数 的文章

 

随机推荐