Excel计算与python和十进制的使用
对不起,这个问题的几个部分。 我需要以非常准确的精度运行计算。
我正在玩Python的十进制,并试图validation计算。 我相信使用实际的数字,你需要有一个string的数字吧? 我正在运行下面的代码。
1)AI把它当作一个浮点,而BI把它当成一个string。 当我排列他们时,我得到不同的数字,是由于浮点算术? B ** 2更正确吗?
2)在最后一个print语句中,我试图获取平方根,但最终得到一个TypeError: unsupported operand type(s) for ** or pow(): 'Decimal' and 'float'
。 这是为什么?
3)最后当我试图validationexcel中的100.0897463平方时,我得到了10017.95731439840000000000的答案。 只是由于四舍五入造成的差异? 如果不是通过类似excel的方法validation浮点数与小数点计算的有效方法是什么?
A = decimal.Decimal(100.0897463) B = decimal.Decimal('100.0897463') print A ** 2 print B ** 2 print B ** .5
给我这些数字,
10017.95731439836401246854725 10017.95731439836369
有趣的是,当我运行这样的代码时,我得到了两个完全相同的数字,而且它们不是没有小数精度的打印结果。 为什么会这样?
print "%.20f" % A ** 2 print "%.20f" % B ** 2
结果是:
10017.95731439836345089134 10017.95731439836345089134
1)AI把它当作一个浮点,而BI把它当成一个string。 当我排列他们时,我得到不同的数字,是由于浮点算术? B ** 2更正确吗?
B ** 2更正确。 A是不准确的,因为您正在从float
而不是string初始化Decimal
数。
2)在最后一个print语句中,我试图获取平方根,但最终得到一个TypeError:**或pow():'Decimal'和'float'的不受支持的操作数types。 这是为什么?
由于Decimal
对__pow__
的实现期望参数是相同的types。 即也是一个Decimal
B ** decimal.Decimal('0.5') # this works because B and the exponent are now of the same type
3)最后当我试图validationexcel中的100.0897463平方时,我得到了10017.95731439840000000000的答案。 只是由于四舍五入造成的差异? 如果不是通过excel之类的东西,validation浮点数和小数点计算的有效方法是什么
用手做math。 在这种情况下,你可以看到你正在平方的数字的最后一位是3
,这意味着它的正方形应该以9
结尾。 这强烈暗示,Excel也有舍入/精确问题(预期)。
- 你的其他问题
它看起来像打印前, %f
将Decimal
转换为浮动。 为了减轻这一点,打印%s
:
print '%s' % (A ** 2,) print '%s' % (B ** 2,)
要看到差异。
对于(1),我认为这种差异在于,对于'A'来说,你要input的值是decimal.Decimal()
已经是二进制浮点格式了。 对于B
, decimal.Decimal
从一个string中创build一个表示,所以它可能更像你所期望的。
# The value is already in binary floating point format. A = decimal.Decimal(100.0897463) # Conversion from string B = decimal.Decimal("100.0897463")
对于(2), decimal.Decimal
对象仅支持其他Decimal
对象的**
运算符。 所以以下将起作用:
print B ** decimal.Decimal("0.5")
对于(3),我不确定Excel是做什么的,但是我是这样validation的:
# Essentially, multiply by 1 billion so that we only need to work with # integers. x = 1000897463 print x ** 2 # This gives: 1001795731439836369L
所以,你知道10017.95731439836369
是确切的价值。 有可能有更多的方法来做到这一点。
顺便说一句, print "%f" % value
将print "%f" % value
转换为Python的浮点表示。