城市直播房产教育博客汽车
投稿投诉
汽车报价
买车新车
博客专栏
专题精品
教育留学
高考读书
房产家居
彩票视频
直播黑猫
投资微博
城市上海
政务旅游

Python技法浮点数取整格式化和NaN处理

3月15日 断龙塔投稿
  1。取整的三种方法1。1强转int类型
  这种方法会直接对浮点数的小数部分进行截断(无论是正还是负)。print(int(2。7))2print(int(2。7))21。2采用math。ceil和math。floor
  这种方法的取整规则如下图所示:
  可以看到无论是正数还是负数,都遵循:ceil往数轴正方向取整,floor往数轴负方向取整。实例如下:print(math。ceil(1。27))1print(math。floor(1。27))2print(math。ceil(1。27))2print(math。floor(1。27))11。3采用round
  round原型为round(value,ndigits),可以将一个浮点数取整到固定的小数位。该函数对正数和负数都采取就近取整原则,而当某个值恰好等于两个整数间一半时,取整操作会取到离该值最近的那个偶数。像1。5和2。5这样的值都会取整到2。示例如下:print(round(1。23,0))1。0print(round(1。23,1))1。2print(round(1。27,1))1。3print(round(1。27,1))1。3print(round(1。25361,3))1。254print(round(1。5,0))2。0print(round(2。5,0))2。0
  传递给round()参数ndigits可以是负数,这种情况下会相应取整到十位、百位、千位:a1627731print(round(a,1))1627730print(round(a,2))1627700print(round(a,3))16280002。格式化浮点数输出
  注意对值输出时别把取整和格式化操作混为一谈。如果只是将数值以固定位数输出,一般是用不着round()的,只要在用format格式化时指定所需要的精度即可(format()格式化操作会根据round()的规则进行取整,最终返回一个字符串类型)。x1234。56789sformat(x,0。2f)print(type(s),format(x,0。2f))classstr1234。57
  除了取整到固定小数位,format()还具有许多格式化功能,如格式化输出对齐,增加千分位分隔符等。实际上面的0。2f就表示至少对齐到0个字符(相当于没有对齐操作),并保留两位小数。
  小提示:。2f也表示至少对齐到0个字符(默认是0),并保留两位小数,
  和0。2f二者是等效的。
  更多示例如下:往右调整以对齐到10个字符print(format(x,10。1f))1234。6往右调整以对齐到10个字符print(format(x,10。1f))1234。6居中以对齐到10个字符print(format(x,10。1f))1234。6增加千位分隔符print(format(x,,))1,234。56789增加千位分隔符并保存到1位小数print(format(x,0,。1f))1,234。6
  如果想使用科学计数法,只要把f改成e或E即可:print(format(x,e))1。234568e03print(format(x,0。2E))1。23E03
  此外,我们还可以利用字符串的translate()方法交换不同的分隔符:swapseparators{ord(。):,,ord(,):。}print(format(x,,)。translate(swapseparators))1。234,56789
  最后,我们这里提一下,调用字符串的。format()函数和单独调用format()函数可以达到相同的效果,如:print(valueis{:0。3f}。format(x))valueis1。235print(Thevalueis{:0,。2f}。format(x))Thevalueis1,234。57
  当然我们也可以使用操作符来对数值做格式化处理,如:print(。2fx)print(10。1fx)print(10。1fx)
  这种格式化操作虽然可行,但是比起更加现代化的format()方法,这种方法就显得不是那么强大了。如果用操作符来格式化数值时,有些功能就没法得到支持了(如添加千位分隔符)。3。执行精确的小数计算
  我们在第一部分介绍了round()函数,我们有可能会企图用浮点取整的方式来修正精度上的问题,如:a2。1b4。2cabprint(c)6。300000000000001print(c6。3)Falseprint(round(c,2))6。3企图这样修正精度(???)
  对大部分浮点数应用程序(包括科学计算与机器学习)来说,一般都不必(或者所不推荐)这么做。虽然Python的浮点运算会引入一些小误差,但这些误差实际上是底层CPU的浮点运算单元和IEEE754浮点算数标准的一种特性。由于Python的浮点数类型保存的数据采用的是原始保存形式,因此只要代码中用到了float实例,那就无法避免这样的误差。
  如果避免出现误差的行为非常重要(比如在金融应用中),那么可以考虑使用decimal模块。事实上在用Python做数据库库接口时经常碰到Decimal对象当访问金融数据时尤其如此。我们通过使用Decimal对象解决上述问题:fromdecimalimportDecimalaDecimal(4。2)bDecimal(2。1)print(type(ab),ab)classdecimal。Decimal6。3print((ab)Decimal(6。3))True
  这么做看起来似乎有点怪异(将数字以字符串的形式来指定)。但是Decimal对象能够以任何期望的方式来工作(支持所有常见的数学操作)。如果要将它们打印出来或者在字符串格式化函数中使用,它们看起来就和普通数字一样。它们也可以和普通int、float类型混合操作(最后会统一强转为Decimal类型):print(type(a1),a1)classdecimal。Decimal5。2
  但是需要注意的是不要将其与普通float类型直接进行比较:print((ab)6。3)False
  decimal模块的强大之处在于在计算过程中灵活地控制数字的位数和四舍五入,如我们可以创建一个本地的上下文环境然后修改精度的设定,如:fromdecimalimportlocalcontextaDecimal(1。3)bDecimal(1。7)print(ab)0。7647058823529411764705882353withlocalcontext()asctx:ctx。prec3print(ab)0。765withlocalcontext()asctx:ctx。prec50print(ab)0。764705882352941176470588235294117647058823529
  不过还是我们上面所说的,如果我们处理的是科学或工程类型的问题,那么更常见的做法是直接使用普通的float浮点类型。首先,在真实世界中极少有东西需要计算到小数点后17位(float提供17位的精度),因此在计算中引入的微小误差不足挂齿;其次,原生的float浮点数运算性能要快许多如果要执行大量计算,性能问题就显得很重要了。
  在使用float类型时,我们同样还需要对类似相减抵消(substractioncancellation)以及把大数和小数加在一起的情况多加小心:nums〔1。23e18,1,1。23e18〕print(sum(nums))0。0
  使用Decimal对象当然可以解决此问题。不过在不动用Decimal对象的情况下,我们可以使用math。fsum()以更精确的实现来解决:importmathprint(math。fsum(nums))1。0
  但对于其它复杂的数值算法,我们就需要研究算法本身,理解其误差传播(errorpropagation)了,这属于数值分析的研究范畴。在数值分析中数学家研究了大量数值算法,其中一些算法的误差处理能力优于其它算法,详情可以参见我的数值计算专栏《orionorion:数值计算》,此处不再详述。4。无穷大、负无穷大和NaN的判断测试
  在实际项目中我们需要对浮点数的无穷大、负无穷大或NaN(notanumber)进行判断测试。在Python中没有特殊的语法来表示这些特殊的浮点值,但是它们可以通过float来创建:afloat(inf)bfloat(inf)cfloat(nan)print(a,b,c)infinfnan
  要检查是否出现了这些值,可以使用math。isinf()和math。isnan()函数:print(math。isinf(a))Trueprint(math。isnan(c))True
  这些特殊浮点数的详细信息可以参考IEEE754规范。但是我们这里有几个棘手的问题需要搞清楚,尤其是设计比较操作和操作符时可能出现的问题。
  无穷大值在数学计算中会进行传播,如:afloat(inf)print(a45)infprint(a10)infprint(10a)0。0
  但是,某些关于无穷大值特定的操作会导致未定义的行为并产生NaN的结果,例如:afloat(inf)print(aa)nanbfloat(inf)print(ab)nan
  NaN会通过所有的操作进行传播,且不会引发任何异常,如:cfloat(nan)print(c23)nanprint(c2)nanprint(c2)nan
  有关NaN,一个微妙的特性是他们在做比较时从不会被判定为相等,如:cfloat(nan)dfloat(nan)print(cd)Falseprint(cisd)False
  正因为如此,唯一安全检测NaN的方法是使用math。isnan()。
  文章来自https:www。cnblogs。comorionorionp16296007。html
投诉 评论 转载

5个被谷歌地图涂黑的地方可以肯定地说,谷歌地图是过去10年中最伟大的技术创新之一。只需单击几下,您就可以查看地球表面的任何地方。嗯,几乎任何地方。由于某种原因,谷歌地图的某些区域以一些非常……欧冠32强出炉!10年前征战第四级联赛的老牌劲旅,如今重返欧随着欧冠附加赛的全部结束,202223赛季欧冠32强及分档已出炉:第一档:皇马、法兰克福、曼城、AC米兰、拜仁慕尼黑、巴黎圣日耳曼、波尔图、阿贾克斯;第二档:利物浦……12分险胜!中国男篮赢球杜锋也该被喷,四节6助攻失误21次太北京时间8月25日,中国男篮对阵哈萨克斯坦队的比赛已经结束,最终男篮6856险胜哈萨克斯坦,世预赛战绩来到5胜2负小组第二。而全场比赛总结,中国男篮的发挥表现正常的竟然就……江苏最值得去的9大景区,每一个名气都很大,看看你去过几个?头号周刊哈喽,大家好,这里是小辉去旅行,用美丽的风光为我们的生命点缀精彩。江苏不但是我国的经济大省,也是我国的旅游大省,其境内的历史文化名城很多,遗留下的风景名胜也……财政部释放四大信号!下半年,资金将投向哪里?今天上午,财政部发布《2022年上半年中国财政政策执行情况报告》,介绍上半年财政政策执行情况和下半年财政政策展望。在公布的数据中,哨兵认为最为突出的一项是:中央一般……前球员若郭艾伦ampampamp周琦都不在CBA打球联赛商业直播吧8月22日讯一位前CBA球员接受了《中国青年报》记者杨屾的采访,谈到了湾区翼龙挖角CBA球员一事。湾区翼龙目前挖走的球员,多数是CBA的边缘球员,但如果郭艾伦去了海……印度足协被全球禁赛!看看印度足协干过的奇葩事8月16日,国际足联理事会宣布,由于第三方施加不当影响,严重违反国际足联章程,暂停印度足球联合会(AIFF)的所有足球活动,处罚立即生效。国际足联表示,只要此前印度法院关于另设……突发,腾讯净利润下滑56向它学习今天,腾讯发布二季度财报,净利润186亿元,同比下滑56,直接被腰斩;与一季度相比,环比下滑了20形势看起来很紧迫。近期,外界能明显地感觉到:腾讯正不顾形象地猛瘦身,流露……买空调,带电辅热好还是不带电辅热好?弄懂需求再入手也不迟买空调,带电辅热好还是不带电辅热好?弄懂需求再入手也不迟!大家在买空调的时候应该也能够知道,现在市面上的空调主要有两种类型。其中一种是我们比较常见的冷暖空调,除了制……iPhoneSE4设计迎来变革,果粉终于等到你作为入门机型,iPhoneSE系列之所以不受待见,主要是因为这三大痛点:4。7英寸小屏,祖传非全面屏设计,单卡单待。除了苹果,没有手机厂商敢在2022年弄这么一个玩意出来。只能……Python技法浮点数取整格式化和NaN处理1。取整的三种方法1。1强转int类型这种方法会直接对浮点数的小数部分进行截断(无论是正还是负)。print(int(2。7))2print(int(2。7))21。2采……很现实的一段话,句句哲理一、这世上不是每一个人都懂得知恩图报,所以别做一个总是委屈自己成全别人的好人。二、我不是话少,也不是冷漠,只是我没必要对每个人都有说有笑,仅此而已三、走好自己的路,……
日媒中芯国际的坚持是对的牧师婚礼誓词白酒执行标准很严,这个标准下出现了一些奇葩现象,今天说说那山那水那人那回忆刘雯眯眯眼,李宇春肖战争地位,暴露了明星对欧美的讨好逗号超下输卵管造影的过程及注意事项租赁造句用租赁造句大全看星座最需要注意的心理效应是什么若已透析了该如何自我控制?核桃仁的保存方法剥好大量核桃仁该怎么保存呢原神香菱最全攻略(你想了解的都有)

友情链接:中准网聚热点快百科快传网快生活快软网快好知文好找江西南阳嘉兴昆明铜陵滨州广东西昌常德梅州兰州阳江运城金华广西萍乡大理重庆诸暨泉州安庆南充武汉辽宁