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也有舍入/精确问题(预期)。

  1. 你的其他问题

它看起来像打印前, %fDecimal转换为浮动。 为了减轻这一点,打印%s

 print '%s' % (A ** 2,) print '%s' % (B ** 2,) 

要看到差异。

对于(1),我认为这种差异在于,对于'A'来说,你要input的值是decimal.Decimal()已经是二进制浮点格式了。 对于Bdecimal.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" % valueprint "%f" % value转换为Python的浮点表示。