吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 982|回复: 12
收起左侧

[Python 原创] Python当中decimal 的舍入方式的学习

[复制链接]
鸠山一茶 发表于 2024-2-28 12:51

@yztengda">昨天有朋友对Python当中的decimal的舍入方式提出了疑问,在此详细回答这位朋友的疑问@yztengda

decimal 模块当中是使用 Context 对象用于控制精度、舍入方式。这些都是通过设置不同的“模式”来实现的。下面是详细讲解decimal的舍入方式:

1. ROUND_DOWN

向零方向舍入,即去掉需要舍入的位数后的所有数字。

import decimal

# ROUND_DOWN模式
decimal.getcontext().rounding = decimal.ROUND_DOWN

a = decimal.Decimal('2.39')
# 向下舍入到小数点后一位
a_rounded = a.quantize(decimal.Decimal('0.0'))
print("a向下舍入后的值为", a_rounded)  # 输出结果应该为2.3

2. ROUND_UP

远离零方向舍入,只要存在舍入位数后的数字,就向上舍入。

import decimal

# ROUND_UP模式
decimal.getcontext().rounding = decimal.ROUND_UP

a = decimal.Decimal('2.31')
# 向上舍入到小数点后一位
a_rounded = a.quantize(decimal.Decimal('0.0'))
print("a向上舍入后的值为", a_rounded)  # 输出结果应该为2.4

3. ROUND_HALF_UP

最近舍入。如果舍入位数的下一位数字大于或等于 5,则向上舍入;否则,向下舍入,这个就是常说的四舍五入。

import decimal

# ROUND_HALF_UP模式
decimal.getcontext().rounding = decimal.ROUND_HALF_UP

a = decimal.Decimal('22.5')
# 四舍五入到整数
a_rounded = a.to_integral_value()
print("a四舍五入后的值为", a_rounded)  # 输出结果应该为23

b = decimal.Decimal('6.542')
# 四舍五入到小数点后两位
b_rounded = b.quantize(decimal.Decimal('0.00'))
print("b四舍五入后的值为", b_rounded)  # 输出结果应该为6.54

4. ROUND_HALF_DOWN

最近舍入,但如果舍入位数的下一位数字为 5,则向下舍入。

import decimal

# ROUND_HALF_DOWN模式
decimal.getcontext().rounding = decimal.ROUND_HALF_DOWN

a = decimal.Decimal('2.35')
# 向下舍入到小数点后一位
a_rounded = a.quantize(decimal.Decimal('0.0'))
print("a向下舍入后的值为", a_rounded)  # 输出结果应该为2.3

5. ROUND_HALF_EVEN

这种舍入方法被称为银行家舍入法。如果舍入位数的下一位数字为 5,且之后没有其他数字或者只有零,则仅当舍入位数为奇数时才向上舍入;否则,向下舍入。

import decimal

# ROUND_HALF_EVEN模式
decimal.getcontext().rounding = decimal.ROUND_HALF_EVEN

a = decimal.Decimal('2.35')
# 向偶数舍入到小数点后一位
a_rounded = a.quantize(decimal.Decimal('0.0'))
print("a向偶数舍入后的值为", a_rounded)  # 输出结果应该为2.4

b = decimal.Decimal('2.25')
# 同样向偶数舍入到小数点后一位
b_rounded = b.quantize(decimal.Decimal('0.0'))
print("b向偶数舍入后的值为", b_rounded)  # 输出结果应该为2.2

6. ROUND_CEILING

向正无穷方向舍入,不论数字的符号,都向上舍入。

import decimal

# ROUND_CEILING模式
decimal.getcontext().rounding = decimal.ROUND_CEILING

a = decimal.Decimal('2.31')
# 向上舍入到小数点后一位
a_rounded = a.quantize(decimal.Decimal('0.0'))
print("a向上舍入后的值为", a_rounded)  # 输出结果应该为2.4

7. ROUND_FLOOR

向负无穷方向舍入,不论数字的符号,都向下舍入。

import decimal

# ROUND_FLOOR模式
decimal.getcontext().rounding = decimal.ROUND_FLOOR

a = decimal.Decimal('2.39')
# 向下舍入到小数点后一位
a_rounded = a.quantize(decimal.Decimal('0.0'))
print("a向下舍入后的值为", a_rounded)  # 输出结果应该为2.3

8. ROUND_05UP

特殊舍入规则,仅当舍入位数的下一位为 0 或 5 时才向上舍入。

import decimal

# ROUND_05UP模式
decimal.getcontext().rounding = decimal.ROUND_05UP

a = decimal.Decimal('2.36')
# 向上舍入到小数点后一位
a_rounded = a.quantize(decimal.Decimal('0.0'))
print("a向上舍入后的值为", a_rounded)  # 输出结果应该为2.3

免费评分

参与人数 3吾爱币 +9 热心值 +3 收起 理由
LQ789 + 1 + 1 热心回复!
yztengda + 1 + 1 谢谢@Thanks!
爱飞的猫 + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

VnYzm 发表于 2024-3-15 13:35
不知道标准库还有这玩意。不过一般直接用Python做数值计算的情况比较少,不知道Numpy和Pytorch支不支持这种自定义舍入。
 楼主| 鸠山一茶 发表于 2024-3-15 21:06
LQ789 发表于 2024-3-5 00:54
没有基础学爬虫能学会吗

爬虫使用Python只是手段,Java一样可以实现,爬虫我认为的难点是JS逆向分析,另外我这个帖子只是一个Python标准库的介绍
 楼主| 鸠山一茶 发表于 2024-2-28 12:55
楼主github的仓库当中也有一些学习记录https://github.com/Hellohistory/Python-Study_CH,欢迎围观与建议
liwanbin 发表于 2024-2-29 22:09
鸠山一茶 发表于 2024-2-28 12:55
楼主github的仓库当中也有一些学习记录https://github.com/Hellohistory/Python-Study_CH,欢迎围观与建议

这是啥子东西,怎么用
 楼主| 鸠山一茶 发表于 2024-3-1 13:06
liwanbin 发表于 2024-2-29 22:09
这是啥子东西,怎么用

这是我学Python的时候写的一些代码
LQ789 发表于 2024-3-5 00:54
没有基础学爬虫能学会吗
 楼主| 鸠山一茶 发表于 2024-3-15 21:08
VnYzm 发表于 2024-3-15 13:35
不知道标准库还有这玩意。不过一般直接用Python做数值计算的情况比较少,不知道Numpy和Pytorch支不支持这种 ...

这个我也用的比较少,还是在初学Python系统学习Python标准库的时候了解到的
夜雨微澜 发表于 2024-3-15 21:12
5是不是内置函数round功能一样的
 楼主| 鸠山一茶 发表于 2024-3-15 21:23
夜雨微澜 发表于 2024-3-15 21:12
5是不是内置函数round功能一样的

是的,但是有一个问题哦,Python3当中确实是输出结果一致,但是Python2(我用的Python2.7测试)结果有一点点不一样
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 15:40

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表