Python 有没有其他方法可以在不进行四舍五入()的情况下,将小数点后的数字切掉?

Python 有没有其他方法可以在不进行四舍五入()的情况下,将小数点后的数字切掉?,python,python-3.x,Python,Python 3.x,我想创建一个函数,无论输入的是什么数字,它都会在第10个数字之后截断(不是四舍五入,可能需要更高的小数位数)。它通常工作正常,但如果我用如下数字调用函数: 1234567.123456789123456789 它返回:1234567.1234567892 而不是预期的1234567.1234567891 def cut_to_10(number): number = str(number) j = 0 if "." in number:

我想创建一个函数,无论输入的是什么数字,它都会在第10个数字之后截断(不是四舍五入,可能需要更高的小数位数)。它通常工作正常,但如果我用如下数字调用函数:

1234567.123456789123456789

它返回:1234567.1234567892

而不是预期的1234567.1234567891

def cut_to_10(number):
    number = str(number)
    j = 0
    if "." in number:
        for i in number:
            j += 1
            if i == ".":
                before_dot = number[:j - 1]
                after_dot = number[j:]
                if len(after_dot) > 10:
                    after_dot = after_dot[:10]

                return float(before_dot + "." + after_dot)

    if "." not in number:
        return round(float(number), 10)
编辑1:

还尝试了此操作,但返回了相同的意外结果

import numpy as np

def cut_to_10(number):
    return np.floor(number * 1e10) / 1e10
编辑2:

考虑到ShadowRanger给出的惊人解释,但同时考虑到我需要更高的天花板精度,而不是地板精度,并且考虑到我仍然需要使用float,我决定改变

返回浮点值(在“+”之前“+”之后)

返回浮点(在“+”之前“+之后)-2e-10


而且效果很好。1e-10不起作用。

有关正确的解决方案,请参阅其他答案。只因为它看起来是一种更直接的方法,一旦您的工作超过了浮点限制,就可以执行截断

import numpy as np
    
def cut_to_10(number):
    return np.floor(number * 1e10) / 1e10

1234567.123456789123456789
不是实际的
float
。您可以键入它,但它会变成
1234567.1234567892
,最接近的可表示的
float
值;舍入是在实际调用
round
之前发生的

>>> 1234567.123456789123456789
1234567.1234567892
如果您需要如此高的精度,则需要移动到
decimal.decimal
,这样就可以了:

>>> decimal.Decimal('1234567.123456789123456789')
Decimal('1234567.123456789123456789')

>>> round(_, 10)
Decimal('1234567.1234567891')

只是不要转换回
float
,因为
1234567.1234567891
不存在(如果它存在,这就是
1234567.12345678123456789
会产生的结果),你会回到你开始的
1234567.1234567892

嘿@Bob,谢谢。它工作得很好,考虑到我更关心的是不超过上限,我只是在行中添加了一个
-2e10
,它工作得很好。