【发布时间】:2020-03-05 01:23:05
【问题描述】:
我知道关于在 python 中舍入的问题已经被问过多次,但答案对我没有帮助。我正在寻找一种将浮点数四舍五入并返回浮点数的方法。该方法还应该接受一个参数,该参数定义要舍入到的小数位。我写了一个实现这种舍入的方法。但是,我认为它看起来一点也不优雅。
def round_half_up(number, dec_places):
s = str(number)
d = decimal.Decimal(s).quantize(
decimal.Decimal(10) ** -dec_places,
rounding=decimal.ROUND_HALF_UP)
return float(d)
我不喜欢它,我必须将 float 转换为字符串(以避免浮点不准确),然后使用 decimal 模块。 您有更好的解决方案吗?
编辑:正如下面的答案所指出的,我的问题的解决方案并不那么明显,因为正确的舍入首先需要正确表示数字,而浮点数不是这种情况。所以我希望下面的代码
def round_half_up(number, dec_places):
d = decimal.Decimal(number).quantize(
decimal.Decimal(10) ** -dec_places,
rounding=decimal.ROUND_HALF_UP)
return float(d)
(与上面的代码不同,只是浮点数直接转换为十进制数,而不是先转换为字符串)在这样使用时返回 2.18:round_half_up(2.175, 2) 但不是因为@ 987654324@ 将返回Decimal('2.17499999999999982236431605997495353221893310546875'),浮点数由计算机表示的方式。
令人惊讶的是,第一个代码返回 2.18,因为浮点数首先转换为字符串。似乎 str() 函数对最初要舍入的数字进行了隐式舍入。所以有两个舍入发生。尽管这是我所期望的结果,但在技术上是错误的。
【问题讨论】:
-
@IcesHay 我不确定我是否通过将数字四舍五入来理解你的意思。你能给我们举一些例子吗?
-
@Kenivia 我的意思是,你从 0-4 向下和从 5-9 向上四舍五入相关的小数位:如果四舍五入到 0 位小数:2.4 = 2; 2.5 = 3; 3.5 = 4 等
标签: python python-3.x rounding