Python 有没有其他方法可以在不进行四舍五入()的情况下,将小数点后的数字切掉?
我想创建一个函数,无论输入的是什么数字,它都会在第10个数字之后截断(不是四舍五入,可能需要更高的小数位数)。它通常工作正常,但如果我用如下数字调用函数: 1234567.123456789123456789 它返回:1234567.1234567892 而不是预期的1234567.1234567891Python 有没有其他方法可以在不进行四舍五入()的情况下,将小数点后的数字切掉?,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:
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
,它工作得很好。