【问题标题】:Simplifying Fraction to Vulgar Fraction code in C#在 C# 中将分数简化为粗俗分数代码
【发布时间】:2014-07-29 13:12:40
【问题描述】:

我有一个特殊情况,我需要尽可能返回“粗俗”分数。我想出的代码如下

var complexFractionString = heaveValue.ToComplexFractionString();
complexFractionString = complexFractionString.Replace("1/8", "⅛");
complexFractionString = complexFractionString.Replace("1/4", "¼");
complexFractionString = complexFractionString.Replace("3/8", "⅜");
complexFractionString = complexFractionString.Replace("1/2", "½");
complexFractionString = complexFractionString.Replace("5/8", "⅝");
complexFractionString = complexFractionString.Replace("3/4", "¾");
complexFractionString = complexFractionString.Replace("7/8", "⅞");

return complexFractionString;

.ToComplexFractionString() 是一种以字符串格式返回双精度数的最小公分母分数的方法。即 .5 的输入将返回“1/2”

这段代码现在适用于我的用例,但我根本不喜欢它的结构。这是非常脆弱的,因为“1/16”或“1/32”的一小部分会在不改变的情况下通过,而且代码是一堆行来做一些应该相对容易的事情。

在 C# 中有没有更好的方法来做到这一点?

【问题讨论】:

  • 为什么用字符串做数学?有一个 struct Fraction { } 并根据 而不是它们的字符串表示形式在 ToString() 中编写代码。
  • 我没有用字符串做任何数学运算...我用双精度数做了数学运算,并以分数形式将数字报告回我的 GUI。不幸的是,我的一些控件不喜欢显示“/”,所以我使用“粗俗”分数来解决这个问题。
  • 如果你有71/80怎么办?
  • 什么样的显示器可以显示½而不是1/2?
  • WPF DataGrids 难以显示 '.'和标题中的“/”。即,如果您尝试显示标题,但该列中的值不会显示。

标签: c#


【解决方案1】:

卢克,使用原力(不可变结构)。

public struct Fraction
{
    readonly int numerator, denominator;

    public Fraction(double x)
    {
        // construct a fraction
    }

    public Fraction(int numerator, int denominator)
    {
        this.numerator=numerator;
        this.denominator=denominator;
    }

    public Fraction Reduced() { /* Simplify */ }

    public override string ToString()
    {
        return GetVulgarFraction(numerator, denominator);
    }

    static string GetVulgarFraction(int numerator, int denominator)
    {
        if(numerator<0)
        {
            // Handle -1/2 as "-½"
            return string.Format("-{0}", 
                GetVulgarFraction(-numerator, denominator));
        }
        if(numerator>denominator)
        {
            // Handle 7/4 as "1 ¾"
            return string.Format("{0} {1}", 
                numerator/denominator, 
                GetVulgarFraction(numerator%denominator, denominator));
        }
        // Handle 0/1 = "0"
        if(numerator==0) return "0";
        // Handle 10/1 = "10"
        if(denominator==1) return numerator.ToString();
        // Handle 1/2 = ½
        if(denominator==2)
        {
            if(numerator==1) return "½";
        }
        // Handle 1/4 = ¼
        if(denominator==4)
        {
            if(numerator==1) return "¼";
            if(numerator==3) return "¾";
        }
        // Handle 1/8 = ⅛
        if(denominator==8)
        {
            if(numerator==1) return "⅛";
            if(numerator==3) return "⅜";
            if(numerator==5) return "⅝";
            if(numerator==7) return "⅞";
        }
        // Catch all
        return string.Format("{0}/{1}", numerator, denominator);
    }
}

【讨论】:

  • 确保处理numerator &gt; denominator 使用复分数表示法的情况。
  • 我不确定这对我当前的代码有何帮助。它不再灵活、更长,并且不能处理大于 1 的复杂分数。
  • 现在可以了,并且1/20 不会像在您的代码中那样将其显示为½0(您的原始问题)。
  • 它现在唯一需要处理的是denominator&lt;=0。以后怎么做是你的选择。
  • 您在我发表评论的同时发布了修订版。你对大约 1/20 的观察是正确的。我想我希望有比这更直接的东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-25
  • 1970-01-01
  • 2011-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多