比较 Python 从浮点数和字符串创建的小数
Comparing Python Decimals created from float and string
谁能解释一下为什么下面三个例子不都一样?
ipdb> Decimal(71.60) == Decimal(71.60)
True
ipdb> Decimal('71.60') == Decimal('71.60')
True
ipdb> Decimal(71.60) == Decimal('71.60')
False
是否有一种通用的 'correct' 方法可以在 Python 中创建 Decimal
对象? (即,作为字符串或浮点数)
默认使用的浮点数以 2 为基数。71.6 不能以 2 为基数准确表示。(想想像 1/3 这样的数字以 10 为基数)。
因此,它们将被转换为浮点数可以表示的小数位数。因为基数 2 中的数字 71.6 会永远持续下去,而且您几乎可以肯定没有无穷无尽的内存可以玩,所以计算机决定用更少的位数来表示它(嗯,被告知)。
如果您改用字符串,程序可以使用算法对其进行精确转换,而不是从不可靠的四舍五入浮点数开始。
>>> decimal.Decimal(71.6)
Decimal('71.599999999999994315658113919198513031005859375')
与
相比
>>> decimal.Decimal("71.6")
Decimal('71.6')
但是,如果您的数字可以精确表示为浮点数,则它与字符串一样准确
>>> decimal.Decimal(71.5)
Decimal('71.5')
通常使用Decimal
来避免浮点精度问题。例如,float
文字 71.60
在数学上不是 71.60
,而是一个非常接近它的数字。
因此,使用float
来初始化Decimal
并不能避免这个问题。一般来说,应该使用字符串来初始化Decimal
.
谁能解释一下为什么下面三个例子不都一样?
ipdb> Decimal(71.60) == Decimal(71.60)
True
ipdb> Decimal('71.60') == Decimal('71.60')
True
ipdb> Decimal(71.60) == Decimal('71.60')
False
是否有一种通用的 'correct' 方法可以在 Python 中创建 Decimal
对象? (即,作为字符串或浮点数)
默认使用的浮点数以 2 为基数。71.6 不能以 2 为基数准确表示。(想想像 1/3 这样的数字以 10 为基数)。
因此,它们将被转换为浮点数可以表示的小数位数。因为基数 2 中的数字 71.6 会永远持续下去,而且您几乎可以肯定没有无穷无尽的内存可以玩,所以计算机决定用更少的位数来表示它(嗯,被告知)。
如果您改用字符串,程序可以使用算法对其进行精确转换,而不是从不可靠的四舍五入浮点数开始。
>>> decimal.Decimal(71.6)
Decimal('71.599999999999994315658113919198513031005859375')
与
相比>>> decimal.Decimal("71.6")
Decimal('71.6')
但是,如果您的数字可以精确表示为浮点数,则它与字符串一样准确
>>> decimal.Decimal(71.5)
Decimal('71.5')
通常使用Decimal
来避免浮点精度问题。例如,float
文字 71.60
在数学上不是 71.60
,而是一个非常接近它的数字。
因此,使用float
来初始化Decimal
并不能避免这个问题。一般来说,应该使用字符串来初始化Decimal
.