Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用unicode普通分数创建紧凑/人性化的浮动_Python_Unicode_Floating Point - Fatal编程技术网

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

Python 使用unicode普通分数创建紧凑/人性化的浮动,python,unicode,floating-point,Python,Unicode,Floating Point,是否有任何模块(最好在标准库中)可以将浮点数转换为更人性化的内容?也许它不是更人性化,但至少更紧凑 4.625将变成“4”⅝" (将圆周率识别到合理精度的额外布朗尼点数) 这是我能想到的最好的代码大纲: import unicodedata def simplify_float(number): vf = "VULGAR FRACTION " vulgars = {0.125 : unicodedata.lookup(vf + "ONE EIGHTH"),

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

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

有。不太可能有更多的字符串(因为它们只存在于与其他字符集的向后兼容性),所以硬编码它们可能足够健壮

分数编码的一般方法是使用
/
U+2044分数斜杠。允许字体成型/布局引擎使用分数斜杠(例如,1/2)渲染数字,并将其作为倾斜或堆叠分数(例如,½)-但是,我没有遇到任何这样的情况(遗憾的是,即使是普通渲染也非常难看)


不清楚处理精度的最佳方法是什么(例如,
1/3
)因为这取决于数字的格式和可接受的错误程度。

Symphy可以帮助识别pi、e等的倍数、分数和幂。这是一个非常简洁的模块。它看起来可以识别这些东西,但不一定使用unicode字符表示分数。我主要寻找一些常见的unicode fr使uiSympy更紧凑但仍然可读的操作可以使用LaTex;我不知道unicode。分母中幂为2的分数将是精确的,但其他分数(如1/3)由于四舍五入,当您将它们用作dict的键时可能会给您带来麻烦。您可以将分数斜杠与上标/下标数字组合使用吗?不,它不适用于它们。只支持“十进制数字”(上标/下标数字被归类为“其他数字”,通常不建议使用)。只有当数字是离分数最近的浮点(intPart*3+1)/3时,我才会使用1/3。最终,当数字与浮点(intPart+float(1/3))匹配时,这可能会降级,但这种双舍入听起来不太令人满意。。。
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)