python-使用unicode粗俗的分数创建紧凑/对人类友好的浮点数
作者:互联网
是否有任何模块(最好是在标准库中)可以将浮点数转换为更人性化的模块?也许它不是更人性化,但至少更紧凑.
例如. 4.625将变成“4⅝”
(用于识别pi的合理精度的布朗尼积分)
这段代码概述是我能想到的最好的代码:
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 FRACTION SLASH.允许字体整形/布局引擎渲染带有斜线或堆叠分数(例如½)的分数斜线(例如1⁄2)的数字-但是,我还没有遇到任何这样做(甚至普通渲染是不幸的是很丑).
import math
import fractions
VULGAR_FRACTIONS = {(5, 8) : '\u215D', ...}
def compact_float(number):
parts = math.modf(number)
fraction = fractions.Fraction(parts[0])
simple = (fraction.numerator, fraction.denominator)
form = VULGAR_FRACTIONS.get(simple)
return '%i%s' % (parts[1], form) if form else str(number)
尚不清楚处理精度(例如1/3)的最佳方法是什么,因为这将取决于您数字的格式以及可接受的误差量.
标签:unicode,floating-point,python 来源: https://codeday.me/bug/20191119/2038852.html