只取两个小数而不四舍五入

时间:2019-04-28 05:44:35

标签: python python-3.x

基本上,我有一个小数太多的浮点数列表。因此,当我创建带有两个小数的第二个列表时,Python将它们四舍五入。我使用了以下内容:

g1= ["%.2f" % i for i in g]

其中g1是带有两位小数的新列表,但四舍五入,而g是带有浮点数的列表。

如何在不四舍五入的情况下制作一个? 我是新手,顺便说一句。谢谢!

4 个答案:

答案 0 :(得分:1)

那么,您要截断第二位数字吗? 注意,无论如何,舍入可能是更好,更准确的解决方案。

如果要截断数字,有两种方法-其中一种是将数字乘以10升至所需的小数位数(2位为100),应用“ math.floor”,并将总数除以相同的数字。

但是,由于内部浮点算术不是以10为底的,因此您冒着在除法上获得更多小数位以缩小比例的风险。

另一种方法是在“。”之后创建一个3位数字的字符串。并删除最后一个-就是四舍五入的证明。

同样,请记住,这会将数字转换为字符串-仅出于演示目的而应该执行的操作。同样,“%”格式化是格式化字符串中的参数的相当老的方法。在现代Python中,f字符串是首选方式:

g1 = [f"{number:.03f}"[:-1] for number in g]

当然,另一种更正确的方法是将数字视为数字,而不是在数字上添加或删除数字的把戏。如评论中所述,以上方法适用于“ 1.227”之类的数字,该数字将保留为“ 1.22”,但不适用于“ 2.99999”,后者将四舍五入为“ 3.000”,然后截断为“ 3.00”。 Python具有decimal模块,该模块允许任意精度的十进制数字-如果需要,可以包括较低的精度,并控制Python进行舍入的方式-包括舍入到零而不是最接近的数字。

只需将小数上下文设置为decimal.ROUND_DOWN策略,然后使用内置的round来转换数字(与使用带浮点数的舍入方法不同,可以保证数字的确切数目) ,或者只是将舍入作为字符串格式化的一部分。您也可以在同一步骤中将float转换为Decimals:

from decimals import Decimal as D, getcontext, ROUND_DOWN

getcontext().rounding = ROUND_DOWN

g1 = [f"{D(number):.02f}" for number in g]

再次-通过此操作,您还可以将数字保留为小数对象,并且仍然可以对它们执行数学运算:

g2 = [round(D(number, 2)) for number in g]

答案 1 :(得分:1)

这是我的解决方案,我们甚至不需要将数字转换为字符串即可获得所需的输出:

def format_till_2_decimal(num):
    return int(num*100)/100.0


g = [-5.427926, -12.222018, 7.214379, -16.771845, -6.1441464, 10.1383295, 14.740516, 5.9209185, -9.740783, -10.098338]

formatted_g = [format_till_2_decimal(num) for num in g]
print(formatted_g)

希望此解决方案有帮助!

答案 2 :(得分:0)

以下可能是您要寻找的答案:

g = [-5.427926, -12.222018, 7.214379, -16.771845, -6.1441464, 10.1383295, 14.740516, 5.9209185, -9.740783, -10.098338]

def trunc(number, ndigits=2):
    parts = str(number).split('.') # divides number into 2 parts. for ex: -5, and 4427926 
    truncated_number = '.'.join([parts[0], parts[1][:ndigits]]) # We keep this first part, while taking only 2 digits from the second part. Then we concat it together to get '-5.44'
    return round(float(truncated_number), 2)  # This should return a float number, but to make sure it is roundded to 2 decimals. 

g1 = [trunc(i) for i in g]
print(g1)
[-5.42, -12.22, 7.21, -16.77, -6.14, 10.13, 14.74, 5.92, -9.74, -10.09]

希望这会有所帮助。

答案 3 :(得分:0)

实际上,如果您正在寻找David的答案,可以按照以下步骤简单地完成:

g = [-5.427926, -12.222018, 7.214379, -16.771845, -6.1441464, 10.1383295, 14.740516, 5.9209185, -9.740783, -10.098338]

g1 = [("%.3f" % i)[:-1] for i in g]

只需取3个小数,然后从结果字符串中删除最后一个字符。 (您可以根据需要将结果转换为浮点数)