今天在进行自动化测试时偶然发现使用 python 的 round 方法保留 1 位和 2 位小数位时没有进行四舍五入,如下: print(round(1.5,0)) 返回 2.0 print(round(1.45,1)) 返回 1.4,没有进行四舍五入 print(round(1.845,2)) 返回 1.84,没有进行四舍五入 print(round(1.8445,3)) 返回 1.845 使用 python 3.7 和 3.9 版本测试均是如此,各位大佬们可有解决方案?
这是计算机的问题,不是 python 的问题,计算机是二进制,你用内置的 decimal 库就行了 话说这种问题不直接百度或者 gpt 问下吗? 很死板的问题
经常贪污的同学都知道,四舍五入会导致刑期虚高
建议你看下 python 的官方文档或者用你的 gpt 查一下什么是 “银行家舍入法” 之后再来回答啊,不要误导我啊大佬。
对精度有要求就用 decimal,特别是浮点数,计算机都是近似表示的
浮点数真是一个超坑的类型,位数多了就会出现精度丢失和科学技术法的问题
就爱看你的回复
首先使用 round 进行舍入时会存在误差,就拿默认的银行家舍入法来说,当数字的下一位等于 5 时,若前一位是偶数,则舍去;若前一位是奇数,则进位。但是 round(2.675, 2) 是输出: 2.67,而非你预期的 2.68,就是因为是计算机使用二进制浮点数表示小数导致的精度问题。
你文档里没说清楚,如果你不想要这种默认的银行家舍入,依然是用 decimal 库, 使用 ROUND_HALF_UP 模式,就是 “普通四舍五入” 或 “向上四舍五入” 使用 ROUND_HALF_EVEN 模式,就是银行家舍入法
# 普通四舍五入 from decimal import Decimal, ROUND_HALF_UP def custom_round(value, decimal_places): factor = Decimal(f'1e-{decimal_places}') return Decimal(value).quantize(factor, rounding=ROUND_HALF_UP) #测试,将数字转成字符串可以确保 Decimal 对象能够精确地表示原始数字 print(custom_round('1.45', 1)) # 输出: 1.5 print(custom_round('1.55', 1)) # 输出: 1.6 print(custom_round('1.44', 1)) # 输出: 1.4 print(custom_round('1.46', 1)) # 输出: 1.5 #你的测试用例 print(custom_round('1.45',1)) print(custom_round('1.845',2))
另外,不要排斥用 gpt,它本来就是字典,查一下又不会死,从你回复的态度来看,你似乎很不屑 gpt 默写出来和百度查答案在解决问题上没区别
专业
浮点运算的表达协议是 IEEE 754. python round 的源码实现: https://github.com/python/cpython/blob/main/Objects/floatobject.c 没需求,我不太想花精力看细节了。 问题倒是挺有意思的。