Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 2.7 Python字符串到十进制的转换-奇怪的结果_Python 2.7_Decimal - Fatal编程技术网

Python 2.7 Python字符串到十进制的转换-奇怪的结果

Python 2.7 Python字符串到十进制的转换-奇怪的结果,python-2.7,decimal,Python 2.7,Decimal,我在python中使用Decimal模块,在转换字符串时看到一些相当奇怪的行为 print "orig = %s dec = %.19f" % (rate,Decimal(rate)) 结果: orig = 0.0151 dec = 0.0151000000000000006 orig = 0.00995 dec = 0.0099500000000000005 orig = 0.011075 dec = 0.0110749999999999998 orig = 0.0123 dec = 0.0

我在python中使用Decimal模块,在转换字符串时看到一些相当奇怪的行为

print "orig = %s dec = %.19f" % (rate,Decimal(rate))
结果:

orig = 0.0151 dec = 0.0151000000000000006
orig = 0.00995 dec = 0.0099500000000000005
orig = 0.011075 dec = 0.0110749999999999998
orig = 0.0123 dec = 0.0123000000000000002
orig = 0.01 dec = 0.0100000000000000002
orig = 0.047025 dec = 0.0470249999999999974
orig = -10028392.3750000000000000000 rep = -10028392.3750000000000000000
orig = -10028392.3800000008195638657 rep = -10028392.3699999991804361343
也许更多关于小数舍入的问题似乎也会产生奇怪的结果

print "orig = %.19f rep = %.19f" % (originalCashflow,replacementCashflow)
originalCashflow = originalCashflow.quantize(Decimal('1.00'), rounding=ROUND_HALF_UP)
replacementCashflow = replacementCashflow.quantize(Decimal('1.00'), rounding=ROUND_HALF_UP)
print "orig = %.19f rep = %.19f" % (originalCashflow,replacementCashflow)
结果:

orig = 0.0151 dec = 0.0151000000000000006
orig = 0.00995 dec = 0.0099500000000000005
orig = 0.011075 dec = 0.0110749999999999998
orig = 0.0123 dec = 0.0123000000000000002
orig = 0.01 dec = 0.0100000000000000002
orig = 0.047025 dec = 0.0470249999999999974
orig = -10028392.3750000000000000000 rep = -10028392.3750000000000000000
orig = -10028392.3800000008195638657 rep = -10028392.3699999991804361343

这似乎不对。我做错了什么?

您没有转换字符串。您正在转换浮动

orig = 0.0151
orig_str = "0.0151"

decimal.Decimal(orig)
输出:

Decimal('0.01510000000000000057454041524351850966922938823699951171875')
Decimal('0.0151')
字符串转换是精确的

decimal.Decimal(orig_str)
输出:

Decimal('0.01510000000000000057454041524351850966922938823699951171875')
Decimal('0.0151')

您知道浮点数从一开始就不准确,对吗?你的意思是不准确吗?有很多关于浮点数准确性的文章,包括python文档中的这篇。由于浮点数是如何存储在内存中的,浮点数的实际存储值只是原始小数的近似值,因此根本不准确。