Python在控制台上的十进制精度 - 很奇怪

时间:2017-10-16 20:30:36

标签: python decimal precision

在3中输入了数学和小数。我用第一个输出

确定了
@Annotation public interface UserRepository extends ... {   
  List<User> findByNameNullOrGenderNullOrInterestsNullOrImageIdsNull(); 
}

然后稍微感到沮丧

In[39]:  Decimal(sqrt(2))
Out[39]: Decimal('1.4142135623730951454746218587388284504413604736328125')
真的很困惑......

In[40]:  Decimal(str(sqrt(2)))
Out[40]: Decimal('1.4142135623730951')

为什么In[41}: getcontext().prec=2 In[42]: Decimal(str(sqrt(2))) Out[42]: Decimal('1.4142135623730951') 之后未来2行的输出精度设置为Decimal Out[]?我以为prec=2是否将float string或int作为精度设置的小数转换为输入?

3 个答案:

答案 0 :(得分:3)

正如文档所说的那样Decimal()构造函数:

  

上下文精度不会影响存储的位数。这完全由值的位数决定。例如,即使上下文精度仅为3,Decimal('3.00000')也会记录所有五个零。

摆脱多余精度的一种方法是将一元+运算符应用于结果:

>>> decimal.Decimal(str(math.sqrt(2)))
Decimal('1.4142135623730951')
>>> + decimal.Decimal(str(math.sqrt(2))) # note the leading "+"
Decimal('1.4')

另一种方法是使用上下文对象的.create_decimal()方法:

>>> decimal.getcontext().create_decimal(str(math.sqrt(2)))
Decimal('1.4')

正如create_decimal的文档所说:

  

与Decimal构造函数不同,上下文精度,舍入方法,标志和陷阱应用于转换。

答案 1 :(得分:2)

来自documentation

  

Decimal的重要性仅取决于输入的位数。上下文精度和舍入仅在算术运算期间发挥作用。

由于您没有对Decimal(str(sqrt(2)))进行任何算术运算,因此它没有使用您设置的精度。您可以通过添加一个简单的算术运算来解决这个问题。

In: Decimal(str(sqrt))) + 0
Out: Decimal('1.4')

答案 2 :(得分:1)

关于第2部分 str(v)浮点v的输出显示v == float(str(v))为真的最短表示。

Python docs说:

由于显示值的方式,许多用户不知道近似值。 Python仅将十进制近似值打印到机器存储的二进制近似值的真实十进制值。在大多数机器上,如果Python要打印存储为0.1的二进制近似值的真实十进制值,则必须显示

>>> 0.1
0.1000000000000000055511151231257827021181583404541015625

这比大多数人认为有用的数字更多,因此Python通过显示舍入值来保持可管理的位数

>>> 1 / 10
0.1

请记住,即使打印结果看起来像1/10的精确值,实际存储的值也是最接近的可表示二进制分数。

关于第3部分Python docs说:

上下文精度不会影响存储的位数。这完全由值的位数决定。例如,即使上下文精度仅为3,Decimal(&#39; 3.00000&#39;)也会记录所有五个零