编程语言
首页 > 编程语言> > python-使用unicode粗俗的分数创建紧凑/对人类友好的浮点数

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