使用unicode普通分数创建紧凑/人性友好的浮动

2024-05-16 17:56:48 发布

您现在位置:Python中文网/ 问答频道 /正文

是否有任何模块(最好是在标准库中),可以将浮点数转换为更人性化的东西?也许它不是更人性化,但至少更紧凑。在

例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模块可以很容易地转到另一个方向,但是我首先找不到一个好的方法来编写这些字符串。在


Tags: 模块numberreturniflookuponethreedecimal
1条回答
网友
1楼 · 发布于 2024-05-16 17:56:48

only twenty of these fraction forms in Unicode。不太可能会有更多(因为它们只存在于与其他字符集的向后兼容),所以硬编码它们可能足够健壮。在

分数编码的一般方法是使用U+2044分数斜杠。字体成形/布局引擎允许使用分数斜杠(例如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),因为这取决于数字存在的格式以及可以接受的误差大小。在

相关问题 更多 >