繁体   English   中英

如何将浮点数四舍五入到某个小数位?

[英]How to round a floating point number up to a certain decimal place?

假设我有8.8333333333333339 ,我想将其转换为8.84 如何在 Python 中完成此操作?

round(8.8333333333333339, 2)给出8.83而不是8.84 我是 Python 或一般编程的新手。

我不想将其打印为字符串,结果将进一步使用。 有关该问题的更多信息,请查看Tim Wilson 的 Python 编程技巧:贷款和付款计算器

8.833333333339 (或8.833333333333334 106.00/12的结果)正确四舍五入到两位小数是8.83 从数学上讲,这听起来像是您想要的天花板函数 Python 的math模块中的一个名为ceil

import math

v = 8.8333333333333339
print(math.ceil(v*100)/100)  # -> 8.84

分别地,地板和天花板函数通常将实数映射到最大的前一个或最小的后一个整数,其中小数位为零 - 因此要将它们用于 2 个小数位,数字首先乘以 10 2 (或 100)以移动小数点,然后除以它来补偿。

如果您出于某种原因不想使用math模块,您可以使用我刚刚写的这个(经过最少测试的)实现:

def ceiling(x):
    n = int(x)
    return n if n-1 < x <= n else n+1

所有这些与链接的贷款和付款计算器问题有何关系:

贷款计算器输出截图

从样本输出看来,他们将每月付款四舍五入,这就是许多人所说的上限函数的效果。 这意味着每个月支付的总金额略高于112 这使得最后的付款比平时少了一点——剩下的未付余额只有8.76

使用正常四舍五入产生每月付款8.83和略高的最终付款8.87将同样有效。 然而,在现实世界中,人们通常不喜欢他们的付款增加,因此将每笔付款四舍五入是常见的做法 - 它还可以更快地将钱退还给贷方。

这是正常的(与 Python 无关),因为 8.83 不能完全表示为二进制浮点数,正如 1/3 不能完全表示为十进制(0.333333...无限期)。

如果要确保绝对精度,则需要decimal模块:

>>> import decimal
>>> a = decimal.Decimal("8.833333333339")
>>> print(round(a,2))
8.83

您想使用小数模块,但您还需要指定舍入模式。 下面是一个例子:

>>> import decimal
>>> decimal.Decimal('8.333333').quantize(decimal.Decimal('.01'), rounding=decimal.ROUND_UP)
Decimal('8.34')
>>> decimal.Decimal('8.333333').quantize(decimal.Decimal('.01'), rounding=decimal.ROUND_DOWN)
Decimal('8.33')
>>> 

一个更简单的方法是简单地使用 round() 函数。 这是一个例子。

total_price = float()
price_1 = 2.99
price_2 = 0.99
total_price = price_1 + price_2

如果你现在打印 total_price,你会得到

3.9800000000000004

但是如果你像这样将它包含在一个 round() 函数中

print(round(total_price,2))

输出等于

3.98

round() 函数通过接受两个参数来工作。 第一个是您要舍入的数字。 第二个是要四舍五入的小数位数。

如果将 8.8333333333339 取整到两位小数,则正确答案是 8.83,而不是 8.84。 您得到 8.83000000001 的原因是因为 8.83 是一个无法正确表示为二进制的数字,它为您提供了最接近的数字。 如果你想在没有所有零的情况下打印它,按照 VGE 说的做:

print "%.2f" % 8.833333333339   #(Replace number with the variable?)

最简单的方法是使用以下内置函数:

format()

例如:

format(1.242563,".2f")

输出将是:

1.24

同样:

format(9.165654,".1f")

会给:

9.2

只是为了记录。 你可以这样做:

def roundno(no):
    return int(no//1 + ((no%1)/0.5)//1)

在那里,不需要包含/导入

如果你想四舍五入,8.84 是不正确的答案。 8.833333333333 四舍五入是 8.83 而不是 8.84。 如果你想总是四舍五入,那么你可以使用 math.ceil。 将两者与字符串格式结合使用,因为舍入浮点数本身没有意义。

"%.2f" % (math.ceil(x * 100) / 100)

这是我对向上/向下舍入问题的解决方案

< .5  round down

> = .5  round up

import math

def _should_round_down(val: float):
    if val < 0:
        return ((val * -1) % 1) < 0.5
    return (val % 1) < 0.5

def _round(val: float, ndigits=0):
    if ndigits > 0:
        val *= 10 ** (ndigits - 1)
    is_positive = val > 0
    tmp_val = val
    if not is_positive:
        tmp_val *= -1
    rounded_value = math.floor(tmp_val) if _should_round_down(val) else math.ceil(tmp_val)
    if not is_positive:
        rounded_value *= -1
    if ndigits > 0:
        rounded_value /= 10 ** (ndigits - 1)
    return rounded_value

# test
# nr = 12.2548
# for digit in range(0, 4):
#     print("{} decimals : {} -> {}".format(digit, nr, _round(nr, digit)))

# output
# 0 decimals : 12.2548 -> 12
# 1 decimals : 12.2548 -> 12.0
# 2 decimals : 12.2548 -> 12.3
# 3 decimals : 12.2548 -> 12.25

使用decimal模块: http : //docs.python.org/library/decimal.html

ََََََََ

我有这个代码:

tax = (tax / 100) * price

然后这个代码:

tax = round((tax / 100) * price, 2)

回合对我有用

这是为您执行此操作的简单函数:

def precision(num,x):
    return "{0:.xf}".format(round(num))

这里,num 是十进制数。 x 是要舍入浮点数的小数。

与其他实现相比的优点是它可以在小数点的右端填充零,使十进制数最多为 x 位小数。

示例 1:

precision(10.2, 9)

会回来

10.200000000(最多9位小数)

示例 2:

precision(10.2231, 2)

会回来

10.22(最多两位小数)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM