在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作为精度设置的小数转换为输入?
答案 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)
新
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仅将十进制近似值打印到机器存储的二进制近似值的真实十进制值。在大多数机器上,如果Python要打印存储为0.1的二进制近似值的真实十进制值,则必须显示
>>> 0.1
0.1000000000000000055511151231257827021181583404541015625
这比大多数人认为有用的数字更多,因此Python通过显示舍入值来保持可管理的位数
>>> 1 / 10
0.1
请记住,即使打印结果看起来像1/10的精确值,实际存储的值也是最接近的可表示二进制分数。
关于第3部分,Python docs说:
上下文精度不会影响存储的位数。这完全由值的位数决定。例如,即使上下文精度仅为3,Decimal(&#39; 3.00000&#39;)也会记录所有五个零