我正在阅读一个JSON数据文件,可能会给我一个浮动值,比如1.1。当我制作Decimal
这个值时,由于浮点数的二进制表示的不精确性,我得到了一个疯狂的长数。十进制(str(my_float))似乎比十进制(my_float)更好,发生了什么事?
我明白二进制表示法,我很满意这个想法,即在base-ten浮点数中可写的数字不能总是以base-two表示。
但似乎如果我串 - 如果首先浮动,并使用该字符串作为值的十进制,我得到一个十进制没有微小的二元 - 不精确三角洲。
这里就是我的意思是:
Python 2.7.6 (default, Jan 16 2014, 10:55:32)
>>> from decimal import Decimal
>>> f = 1.1
>>> d = Decimal(f)
>>> f
1.1
>>> d
Decimal('1.100000000000000088817841970012523233890533447265625')
>>> d = Decimal(str(f))
>>> d
Decimal('1.1')
串ifying使它成为一个小数点前的浮动似乎给我一个结果更接近原始基地十号输入号码(或从一个读JSON文件)。
所以,这里是我的问题:当把字符串化为浮点数时,为什么我看不到数字的长尾? python是否自动跟踪从JSON中解析出来的原始字符串,或者什么?为什么Decimal构造函数不使用该技巧呢?
“为什么Decimal构造函数不使用这个技巧呢?很明显,“十进制”模块的设计者认为严格的准确性是一个更好的结果。我不知道他们为什么会这么想,因为模块的全部内容是使用不能用二进制表示的十进制数。你所看到的数字是确切的 - 一个二进制数总是可以用十进制表示,即使反过来也是如此。 –