一、现象描述

由于 python3 包括python2.7 以后的round策略使用的是decimal.ROUND_HALF_EVEN
即Round to nearest with ties going to nearest even integer. 也就是只有在整数部分是奇数的时候, 小数部分才逢5进1; 偶数时逢5舍去。 这有利于更好地保证数据的精确性, 并在实验数据处理中广为使用。

二、修改decimal上线文,实现一般意义上的精确四舍五入

ROUND_HALF_UP (to nearest with ties going away from zero), or

import decimal
from decimal import Decimalprint(decimal.getcontext())context=decimal.getcontext() # 获取decimal现在的上下文
context.rounding = decimal.ROUND_HALF_UP #修改rounding策略print(decimal.getcontext())print(round(Decimal(1.5659898), 2))
print(round(Decimal(1.5344898), 2))
print(round(Decimal(2.5659898), 2))
print(round(Decimal(2.5359898), 2))# with decimal.localcontext() as ctx:
#     ctx.prec = 32
#     ctx.rounding=decimal.ROUND_HALF_UP
#     print(round(decimal.Decimal(2.669), 2))
#     print(round(decimal.Decimal(1.635), 2))

运行结果:

Context(prec=28, rounding=ROUND_HALF_EVEN, Emin=-999999, Emax=999999, capitals=1, clamp=0, flags=[], traps=[InvalidOperation, DivisionByZero, Overflow])
1.57
1.53
2.57
2.54
Context(prec=28, rounding=ROUND_HALF_UP, Emin=-999999, Emax=999999, capitals=1, clamp=0, flags=[Inexact, FloatOperation, Rounded], traps=[InvalidOperation, DivisionByZero, Overflow])

三、自定义四舍五入方法实现精确四舍五入

def round_up(number,power=0):"""实现精确四舍五入,包含正、负小数多种场景:param number: 需要四舍五入的小数:param power: 四舍五入位数,支持0-∞:return: 返回四舍五入后的结果"""digit = 10 ** powernum2 = float(int(number * digit))# 处理正数,power不为0的情况if number>=0 and power !=0:tag = number * digit - num2 + 1 / (digit * 10)if tag>=0.5:return (num2+1)/digitelse:return num2/digit# 处理正数,power为0取整的情况elif  number>=0 and power==0 :tag = number * digit - int(number)if tag >= 0.5:return (num2 + 1) / digitelse:return num2 / digit# 处理负数,power为0取整的情况elif power==0 and number<0:tag = number * digit - int(number)if tag <= -0.5:return (num2 - 1) / digitelse:return num2 / digit# 处理负数,power不为0的情况else:tag = number * digit - num2 - 1 / (digit * 10)if tag <= -0.5:return (num2-1)/digitelse:return num2/digitprint(round_up( 2.4259, 0))
print(round_up( -2.625, 2))
print(round_up( -2.635, 2))
print(round_up( 0, 0))

结果示例:
2.0
-2.63
-2.64
0.0

参考:

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

python实现小数精确四舍五入相关推荐

  1. python保留小数不四舍五入_Python3小数(浮点数)精度处理,[不]四舍五入去小数点后几位...

    在使用Python3处理浮点数时会遇到处理精度的问题,例如: >>> a = 2019.9102 >>> b = 666.333 >>> a - ...

  2. python 舍去小数_python小数的进位与舍去

    一.基础知识准备 ​ 奇进偶舍,又称为四舍六入五成双规则.银行进位法(Banker's Rounding),是一种计数保留法,是一种数值修约规则.从统计学的角度,"奇进偶舍"比&q ...

  3. python怎么使用int四舍五入_python中如何取整数

    首先,不得不提醒大家一个容易被忽视或者搞混的问题--一般的,0.5这种末尾是5的小数,四舍五入取整应进位.这个进位的意思是:-0.5 → -1:0.5 → 1.即正负情况不同,都向着远离0,使得绝对值 ...

  4. python将小数转为分数_Python分数

    python将小数转为分数 Python分数模块 (Python fractions module) As we know, a fraction is a number which represen ...

  5. 保留两位小数的四舍五入

    在项目中遇到计算费用的需求,数值需要是保留两位小数的四舍五入. 四舍五入的函数为Math.Round(),保留小数位的方法是Number.toFixed(). 注意:Number.toFixed()将 ...

  6. Python中小数的处理

    Python中小数的处理包括四舍五入.取整(向上取整.向下取整),向0取整,获取一个数的小数部分. 四舍五入 需要用到round(value, 保留的小数位数)函数,如下49.698按照四舍五入保留两 ...

  7. php保留两位小数 非四舍五入,PHP保留两位小数并且四舍五入及不四舍五入的方法...

    PHP保留两位小数并且四舍五入及保留两位小数并且不四舍五入该如何实现,不会的朋友可以详细参考下本文,希望对大家有所帮助 php保留两位小数并且四舍五入$num = 123213.666666; ech ...

  8. java 小数精确_Java中小数精确计算

    小数精确计算 System.out.println(2.00 -1.10);//0.8999999999999999 上面的计算出的结果不是 0.9,而是一连串的小数.问题在于1.1这个数字不能被精确 ...

  9. python用format保留三位小数_关于Python 保留小数使用format、%、round()、Decimal函数及format和%只能保留到六位问题...

    Python 保留小数 1.可以使用format内置函数格式化输出 import math PI = math.atan(1.0)*4 # atan(1.0)*4 = π print('{:.7f}' ...

最新文章

  1. dedecms 漏洞_代码审计之二次漏洞审计
  2. linux系统关机half,Linux 学习 (六) 关机与重启命令
  3. 2021年95后“他经济”研究报告
  4. 雨滴桌面时间插件_真香!这 3 款软件,让你的电脑桌面清爽又高效!
  5. 农民工兄弟学C#(4)
  6. java语句以什么结尾_[JAVA] 关于语句的结尾
  7. mysql锁的级别_mysql 锁和各锁级别
  8. 拯救节日邮件!专属这个节假季的EDM营销方案
  9. 第二届金融交易技术大会拥抱Fin Tech-创新、科技、融合在沪圆满落幕!
  10. 【转载】专利翻译常用词句
  11. excel文件导出进度条的实现
  12. 2021寒假笔记(数论)
  13. 近期基金有所上涨,你的基金回本了吗?如果回本了,你还会继续持仓吗?
  14. 模拟手机预览(非F12)
  15. randint和randrange的区别
  16. C#使用随机数模拟器来模拟世界杯排名(二)
  17. 谷歌AI专家爆料:90%的人都不知道,编程能力差,其实都是输在了这点上!
  18. suse 15破解root密码
  19. pytest-daytwo(fixture、allure等概论,并没有完全懂,后续再详细写)
  20. 稳定可靠github加速神器 FastGithub

热门文章

  1. html text-indent,css之text-indent
  2. linux c语言 格式化,格式化C语言命令indent
  3. Python游戏开发,pgzrun模块,Python实现阿肯色克隆人游戏
  4. F - 寒冰王座 HDU - 1248
  5. aarch64汇编入门学习——1
  6. fragment 淡入淡出_Activity和Fragment的转场动画
  7. 常见的降维方法(PCA,SVD)
  8. java qq登录_JAVA实现QQ第三方登录
  9. 最新效率测评——利用Java向Mysql插入
  10. 双11,美的、格力们又盯上了厨房小家电