Clipi Asked: 2020-02-12 07:21:30 +0800 CST 2020-02-12 07:21:30 +0800 CST 2020-02-12 07:21:30 +0800 CST 在 Python 中限制重复数字中的位数 772 今天我开始使用python,我想知道......如果我把print(10/3)答案限制在 3.3333333333333335 因为显然他不能写出无限的数字……但是有没有办法改变他写的数字的数量?例如,不要写 16 个十进制数字,而是写 20、3 或 45(我可以调节数字的数量,总结) python 6 Answers Voted Best Answer abulafia 2020-02-12T08:22:03+08:002020-02-12T08:22:03+08:00 问题不在于您想用多少小数显示数字("{:.10f}".format(10/3)例如,您可以使用格式字符串控制它,而在于它实际存储的精度。 默认情况下,浮点数以称为 IEEE-754 的格式存储,该格式使用 32 位或 64 位(取决于单精度或双精度)来存储任何实数。Python 使用双精度。自然地,在 64 位(这是可能的最高精度)中,最多可以表示 2^64 个不同的数字,这与实数的 Aleph1 阶无穷大相去甚远。也就是说,有无数个数字无法以这种格式表示。 当处理非常小的数字(类型为 0.0000000...01)时,精度非常高,因为整数部分为零的数字以这种格式以特殊方式表示,能够达到 2^( − 1074 ),即修正到十进制 324,但随着数字变大,精度下降,因为可用于表示数字的位数是恒定的,无论逗号在哪里。 因此,对于 1.00000...01 类型的那些(不再有零整数部分),它只能正确存储到大约十进制 16,并且随着整数部分大小的增加,部分分数中的精确小数位数正在减少。 10/3 的结果只能正确存储到小数点 15,之后它已经是错误的,你可以看到如果你尝试用 20 个小数位显示它: >>> print("{:.20f}".format(10/3)) 3.33333333333333348136 在许多科学领域中,floatPython 类型(相当于doubleC 类型)提供的精度就足够了,因为在科学中也很常见的是,在处理小数字时需要很高的精度,而在工作时可以容忍更大的误差数字小,数字大,这样相对误差是恒定的。 但是,如果您想完全控制精度,您应该停止使用类型float并改用Decimal. 这种类型具有任意精度,由程序员设置。可惜操作起来比较麻烦。例如,请参阅如何以 30 个正确小数位的精度计算 10/3: >>> from decimal import Decimal, getcontext >>> getcontext().prec = 30 >>> r = Decimal(10)/Decimal(3) >>> print(r) 3.33333333333333333333333333333 尽管format可以减少显示的小数位数,但如果在这种情况下尝试将其增加到 30 以上,则会发现错误: >>> print("{:.10f}".format(r)) 3.3333333333 >>> print("{:.35f}".format(r)) 3.33333333333333333333333333333000000 最后,注释您还有分数类型,它不会尝试执行除法,而是分别存储分子和分母,这样可以避免在处理分数时出现舍入错误(但在尝试将结果转换为时它们会再次出现float) >>> from fractions import Fraction >>> f = Fraction(10,3) >>> print(f) 10/3 >>> print(float(f)) 3.3333333333333335 Juan 2020-02-12T07:27:38+08:002020-02-12T07:27:38+08:00 您可以执行以下操作: 您声明一个变量并在其中放置除法: division = 10/3 然后你调用它并格式化它 print ("{0:.5f}".format(division)) 在这部分中,您将告诉它最多保留 5 个小数位 {0:.5f} 结果是: 3.33333 如果更改为 2,结果如下: meegle84 2020-02-12T07:39:34+08:002020-02-12T07:39:34+08:00 如果您想要打印具有特定小数位数的数据,您可以执行以下操作: division_con_decimales = 10/3 print("{0:.2f}".format(division_con_decimales)) 结果 3.33 请注意,该值没有被修改,division_con_decimales它仍然具有以前的小数位。如果你想要四舍五入到特定的小数,你可以这样做: menos_decimales = round(division_con_decimales, 2) print(menos_decimales) 结果 3.33 最后,您可以通过以下方式检查它们是否不相等: division_con_decimales == menos_decimales 结果 False Cuauhtli 2020-02-12T07:31:31+08:002020-02-12T07:31:31+08:00 一种优雅而简单的方法是使用math.trunc import math def truncate(numero, cifras): posiciones = pow(10.0, cifras) return math.trunc(posiciones * numero) / posiciones if __name__ == '__main__': numero = 10/3.0 cifras = 3 truncate(numero, cifras) 并且在执行它时,它会返回表单的一个值。 ... 3.333 诀窍是,在posiciones*numero您输入的数字中,位数向右移动,它math.trunc消除了右侧剩余的数字,然后,除以 时posiciones,先前向右移动的相同数字被移动,但现在向左。 即。 如果您输入 5.55555 并想要三位数字,请先将 5.55555*10^3 相乘,得到 5555.55。math.trunc你只得到 5555 然后除以 10^3,所以现在 5555/10^3 = 5,555 Luis Eduardo Garcia 2022-03-27T19:07:43+08:002022-03-27T19:07:43+08:00 x = 3.3333333333333335 print(float("{0:.3f}".format(x))) # output: 3.333 y = float("{0:.3f}".format(x)) Maikel Cordero 2022-06-24T17:50:55+08:002022-06-24T17:50:55+08:00 我看到每个人都在使用,.format()但我很奇怪没有人使用round() 例子 División = 10/3 print(round(división,2) 公式 round(variable, numero de dígitos que queremos mostrar) 该代码将向您显示除法的结果,保留两位小数。
问题不在于您想用多少小数显示数字(
"{:.10f}".format(10/3)
例如,您可以使用格式字符串控制它,而在于它实际存储的精度。默认情况下,浮点数以称为 IEEE-754 的格式存储,该格式使用 32 位或 64 位(取决于单精度或双精度)来存储任何实数。Python 使用双精度。自然地,在 64 位(这是可能的最高精度)中,最多可以表示 2^64 个不同的数字,这与实数的 Aleph1 阶无穷大相去甚远。也就是说,有无数个数字无法以这种格式表示。
当处理非常小的数字(类型为 0.0000000...01)时,精度非常高,因为整数部分为零的数字以这种格式以特殊方式表示,能够达到 2^( − 1074 ),即修正到十进制 324,但随着数字变大,精度下降,因为可用于表示数字的位数是恒定的,无论逗号在哪里。
因此,对于 1.00000...01 类型的那些(不再有零整数部分),它只能正确存储到大约十进制 16,并且随着整数部分大小的增加,部分分数中的精确小数位数正在减少。
10/3 的结果只能正确存储到小数点 15,之后它已经是错误的,你可以看到如果你尝试用 20 个小数位显示它:
在许多科学领域中,
float
Python 类型(相当于double
C 类型)提供的精度就足够了,因为在科学中也很常见的是,在处理小数字时需要很高的精度,而在工作时可以容忍更大的误差数字小,数字大,这样相对误差是恒定的。但是,如果您想完全控制精度,您应该停止使用类型
float
并改用Decimal
. 这种类型具有任意精度,由程序员设置。可惜操作起来比较麻烦。例如,请参阅如何以 30 个正确小数位的精度计算 10/3:尽管
format
可以减少显示的小数位数,但如果在这种情况下尝试将其增加到 30 以上,则会发现错误:最后,注释您还有分数类型,它不会尝试执行除法,而是分别存储分子和分母,这样可以避免在处理分数时出现舍入错误(但在尝试将结果转换为时它们会再次出现
float
)您可以执行以下操作:
您声明一个变量并在其中放置除法:
然后你调用它并格式化它
在这部分中,您将告诉它最多保留 5 个小数位 {0:.5f}
结果是:
3.33333
如果更改为 2,结果如下:
如果您想要打印具有特定小数位数的数据,您可以执行以下操作:
结果
请注意,该值没有被修改,
division_con_decimales
它仍然具有以前的小数位。如果你想要四舍五入到特定的小数,你可以这样做:结果
最后,您可以通过以下方式检查它们是否不相等:
结果
一种优雅而简单的方法是使用
math.trunc
并且在执行它时,它会返回表单的一个值。
诀窍是,在
posiciones*numero
您输入的数字中,位数向右移动,它math.trunc
消除了右侧剩余的数字,然后,除以 时posiciones
,先前向右移动的相同数字被移动,但现在向左。即。
如果您输入 5.55555 并想要三位数字,请先将 5.55555*10^3 相乘,得到 5555.55。
math.trunc
你只得到 5555 然后除以 10^3,所以现在 5555/10^3 = 5,555我看到每个人都在使用,
.format()
但我很奇怪没有人使用round()
例子
公式
该代码将向您显示除法的结果,保留两位小数。