电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

Python浮點型(float)運算結果不正確的解決方案

瀏覽:2日期:2022-07-10 13:29:14

一、問題說明

以前對浮點數(shù)運行沒有沒有太在意。昨天同事要求把百分比結果保存到文件上,然后就以保存1位小數(shù)的形式給他保存了。

但是今天同事運行時問能不能統(tǒng)一以一位小數(shù)的形式保存,當時覺得很奇怪昨天就是以一位小數(shù)形式存的怎么還會提這種要求呢。

其給回的截圖確實是部分是一位小數(shù)的,但一部分是很長的。查看代碼都統(tǒng)一如下格式:

# 使用round保留三位小數(shù),然后乘以100,最后格式化為帶百分號的字符串rate=f'{round(x/y,3) * 100}%'

代碼上沒看出什么問題,直接運行確實是有些結果是一長串的。進行調試發(fā)現(xiàn)當x為37y為76時即會出現(xiàn)問題,如下圖所示:

Python浮點型(float)運算結果不正確的解決方案

進行步驟拆分,發(fā)現(xiàn)round方法沒有問題,問題在浮點數(shù)乘以100上(同時如下圖可以看到也不是所有浮點數(shù)乘都有問題)

Python浮點型(float)運算結果不正確的解決方案

二、原因探究

搞不清原因,直到看到這篇文章:https://www.programiz.com/python-programming/numbers

大意是說二進制對很多浮點數(shù)無法準確表示只能用一個近似值代替,而當使用這些以近似值代替的浮點數(shù)進行進算時本質上是這些進似值參與了運算,出來的結果也就是進似值運算后的結果。

也就是說,一是這不是乘100的問題也不是乘法的問題而是整個浮點數(shù)運算都有問題,二是這不是python的問題是計算機浮點數(shù)存儲的問題像C、Java等其他計算機語言進行運算都會有問題。

Python浮點型(float)運算結果不正確的解決方案

可能有人會疑惑:為什么二進制可以表示2不能表示0.2呢?

這是因為數(shù)值和字符串是不一樣的,如果是字符串那么表示2.2點的左右兩邊的2編碼是一樣的就可以了(如ASCII碼:504650),但數(shù)值不是這樣,數(shù)值的整數(shù)部分和小數(shù)部分需要一個統(tǒng)一的表示形式,那就是加權位計數(shù)法。

整數(shù)部分都要以2的0次方(20)到2的無窮次方(2∞)表示,這沒有問題,只要長度足夠就能表示出所有奇數(shù)和偶數(shù)。2 = 1 * 21 + 0 * 20 = 10

小數(shù)部分都要以2的-1次方(2-1)到2的負無窮次方(2-∞)表示,這就有問題,因為比如2-1...2-∞不管怎么組合都不能完全等于0.2。0.2 = 0 * 2-1 + 0 * 2-2 + 1 * 2-3 ...

三、處理辦法

這情況讓我想起上份工作局方領導的一句話,應該是“可以理解但不能接受”。

原理上二進制無法精確表示一些浮點數(shù)可以理解,但是就這么返回個顯然錯誤的結果給用戶那是無法接受的。

python提供了Decimal()方法讓浮點運算結果可以和人平時運算的結果一樣。(Decimal本質應該還是通過加長長度提高精度)

Python浮點型(float)運算結果不正確的解決方案

# Decimal傳字符串才能準確表示,所以需要先用str()把round()的結果轉為字符串rate=f'{Decimal(str(round(x/y,3))) * 100}%'# 其實上邊的結果出來是48.700%的形式,即三位小數(shù)的形式并不太符合我們保留一位小數(shù)的想法,真正符合想法得下面這樣# rate=f'{round(Decimal(str(round(x/y,3))) * 100, 1)}%'# 其實我們說了這么多,我們都是建立在決定保留多少位再乘100這個前提下,倘若我們先乘100后決定保留幾位那都不需要用Decimal# rate=f'{round(x/y*100,1)}%'

Python浮點型(float)運算結果不正確的解決方案

參考:

https://www.programiz.com/python-programming/numbers

https://docs.python.org/3.7/library/decimal.html

以上就是Python浮點型(float)運算結果不正確的解決方案的詳細內容,更多關于Python浮點型(float)運算結果不正確的資料請關注好吧啦網(wǎng)其它相關文章!

標簽: Python 編程
相關文章:
主站蜘蛛池模板: 济南品牌包装设计公司_济南VI标志设计公司_山东锐尚文化传播 | 合肥办公室装修 - 合肥工装公司 - 天思装饰| 直齿驱动-新型回转驱动和回转支承解决方案提供商-不二传动 | 上海阳光泵业制造有限公司 -【官方网站】 | 药品仓库用除湿机-变电站用防爆空调-油漆房用防爆空调-杭州特奥环保科技有限公司 | 石家庄小程序开发_小程序开发公司_APP开发_网站制作-石家庄乘航网络科技有限公司 | 查分易-成绩发送平台官网| 北京普辉律师事务所官网_北京律师24小时免费咨询|法律咨询 | 有机废气处理-rto焚烧炉-催化燃烧设备-VOC冷凝回收装置-三梯环境 | 沈阳真空机_沈阳真空包装机_沈阳大米真空包装机-沈阳海鹞真空包装机械有限公司 | 中医治疗皮肤病_潍坊银康医院「山东」重症皮肤病救治平台 | 护腰带生产厂家_磁石_医用_热压护腰_登山护膝_背姿矫正带_保健护具_医疗护具-衡水港盛 | 橡胶接头_橡胶软接头_套管伸缩器_管道伸缩器厂家-巩义市远大供水材料有限公司 | 北京京云律师事务所| 气胀轴|气涨轴|安全夹头|安全卡盘|伺服纠偏系统厂家-天机传动 | 合肥白癜风医院_合肥治疗白癜风医院_合肥看白癜风医院哪家好_合肥华研白癜风医院 | 等离子表面处理机-等离子表面活化机-真空等离子清洗机-深圳市东信高科自动化设备有限公司 | 管家婆-管家婆软件-管家婆辉煌-管家婆进销存-管家婆工贸ERP | 浙江上沪阀门有限公司 | 冷凝水循环试验箱-冷凝水试验箱-可编程高低温试验箱厂家-上海巨为(www.juweigroup.com) | 北京租车牌|京牌指标租赁|小客车指标出租 | 贝朗斯动力商城(BRCPOWER.COM) - 买叉车蓄电池上贝朗斯商城,价格更超值,品质有保障! | 杭州顺源过滤机械有限公司官网-压滤机_板框压滤机_厢式隔膜压滤机厂家 | 庭院灯_太阳能景观灯_草坪灯厂家_仿古壁灯-重庆恒投科技 | 卓能JOINTLEAN端子连接器厂家-专业提供PCB接线端子|轨道式端子|重载连接器|欧式连接器等电气连接产品和服务 | 红立方品牌应急包/急救包加盟,小成本好项目代理_应急/消防/户外用品加盟_应急好项目加盟_新奇特项目招商 - 中红方宁(北京) 供应链有限公司 | 臭氧灭菌箱-油桶加热箱-原料桶加热融化烘箱-南京腾阳干燥设备厂 臭氧发生器_臭氧消毒机 - 【同林品牌 实力厂家】 | 国际金融网_每日财经新资讯网| 金刚网,金刚网窗纱,不锈钢网,金刚网厂家- 河北萨邦丝网制品有限公司 | 蓝鹏测控平台 - 智慧车间系统 - 车间生产数据采集与分析系统 | 杭州|上海贴标机-百科 | 电动打包机_气动打包机_钢带捆扎机_废纸打包机_手动捆扎机 | 吨袋包装机|吨包秤|吨包机|集装袋包装机-烟台华恩科技 | 气体检测仪-氢气检测仪-可燃气体传感器-恶臭电子鼻-深国安电子 | 仓储货架_南京货架_钢制托盘_仓储笼_隔离网_环球零件盒_诺力液压车_货架-南京一品仓储设备制造公司 | 电子厂招聘_工厂招聘_普工招聘_小时工招聘信息平台-众立方招工网 | 深圳市源和塑胶电子有限公司-首页 | 礼堂椅厂家|佛山市艺典家具有限公司 | 岩石钻裂机-液压凿岩机-劈裂机-挖改钻_湖南烈岩科技有限公司 | 创绿家招商加盟网-除甲醛加盟-甲醛治理加盟-室内除甲醛加盟-创绿家招商官网 | EPDM密封胶条-EPDM密封垫片-EPDM生产厂家|