是否有任何模块(最好是在标准库中),可以将浮点数转换为更人性化的东西?也许它不是更人性化,但至少更紧凑。在
例4.625将变成“4”
(以合理精度识别圆周率的额外布朗尼点数)
这是我能想到的最好的代码大纲:
import unicodedata
def simplify_float(number):
vf = "VULGAR FRACTION "
vulgars = {0.125 : unicodedata.lookup(vf + "ONE EIGHTH"),
0.2 : unicodedata.lookup(vf + "ONE FIFTH"),
0.25 : unicodedata.lookup(vf + "ONE QUARTER"),
0.375 : unicodedata.lookup(vf + "THREE EIGHTHS"),
0.4 : unicodedata.lookup(vf + "TWO FIFTHS"),
0.5 : unicodedata.lookup(vf + "ONE HALF"),
0.6 : unicodedata.lookup(vf + "THREE FIFTHS"),
0.625 : unicodedata.lookup(vf + "FIVE EIGHTHS"),
0.75 : unicodedata.lookup(vf + "THREE QUARTERS"),
0.8 : unicodedata.lookup(vf + "FOUR FIFTHS"),
0.875 : unicodedata.lookup(vf + "SEVEN EIGHTHS")}
decimal = int(number)
if number == decimal:
return unicode(decimal)
vulgar = vulgars.get(number - decimal)
if vulgar:
if decimal == 0:
return vulgar
return "%d%s" % (decimal, vulgar)
return "%.1f" % number
使用unicodedata模块可以很容易地转到另一个方向,但是我首先找不到一个好的方法来编写这些字符串。在
有only twenty of these fraction forms in Unicode。不太可能会有更多(因为它们只存在于与其他字符集的向后兼容),所以硬编码它们可能足够健壮。在
分数编码的一般方法是使用
⁄
U+2044分数斜杠。字体成形/布局引擎允许使用分数斜杠(例如1/2)和倾斜或堆叠的分数(例如½)渲染数字-但是,我没有遇到过任何这样的引擎(甚至连普通的渲染也很难看)。在目前还不清楚处理精度的最佳方法是什么(例如,
1/3
),因为这取决于数字存在的格式以及可以接受的误差大小。在相关问题 更多 >
编程相关推荐