为什么我必须使用字符串来获得准确的数字处理

use*_*349 1 python decimal

将数据转换为时decimal,我有时会得到不正确的结果:

from decimal import *
D = Decimal
>>> D(5.2).quantize(D('.00000'), rounding=ROUND_DOWN)
Decimal('5.20000')
>>> D(5.3).quantize(D('.00000'), rounding=ROUND_DOWN)
Decimal('5.29999')
Run Code Online (Sandbox Code Playgroud)

我不认为浮点不精确是一个借口,因为我使用专门的类来处理数字!引自pyton docs:

Decimal"基于浮点模型,它是为人们设计的,并且必然具有最重要的指导原则 - 计算机必须提供与人们在学校学习的算法相同的算法." - 摘录自十进制算术规范

这有效:

x=round(x - .0000049,5)
D(str(x) + (5-len(str(x).split('.')[1]))*'0')
Run Code Online (Sandbox Code Playgroud)

Kev*_*vin 10

因为5.3它本身已经错了.当你传递给它时Decimal(),它不会神奇地修复它.您需要Decimal()从一开始就在每一步使用.这意味着写Decimal('5.3')而不是Decimal(5.3).

编辑:OP已声明他们正在使用JSON.以下是从JSON解析Decimal的方法:

import json, decimal
decimal_decoder = json.JSONDecoder(parse_float=decimal.Decimal)
parsed_json = decimal_decoder.decode(raw_json)
Run Code Online (Sandbox Code Playgroud)

(raw_jsonJSON作为字符串在哪里).这将产生正确的小数.

  • @ user3467349:遗憾的是,该类的目的是为base-10算法提供工具.没有工具允许您传入错误的输入,但仍然可以输出正确的输出.`5.3`就是这样."有两次我被问到'祈祷,巴贝奇先生,如果你把错误的数字输入机器,那么正确的答案会出来吗?' 我无法正确理解那些可能引发这样一个问题的想法混乱." ;-) (3认同)